
<!DOCTYPE HTML>
<html lang="" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>logback中文网|第四章：Appenders</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="logback中文网包含了logback中文文档，最新资讯，应用案例等。logback 继承自 log4j，它建立在有十年工业经验的日志系统之上。它比其它所有的日志系统更快并且更小，包含了许多独特并且有用的特性。"><meta name="keywords" content="logback中文文档, logback api文档, logback log4j,springboot logback,logback日志类型">
        <meta name="generator" content="GitBook 3.2.3">
        
        
        
    
    <link rel="stylesheet" href="gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
                
            
        

    

    
        
    
        
    
        
    
        
    
        
    
        
    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="05第五章Encoder.html" />
    
    
    <link rel="prev" href="03第三章logback的配置.html" />
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="Type to search" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="./">
            
                <a href="./">
            
                    
                    Introduction
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="01第一章logback介绍.html">
            
                <a href="01第一章logback介绍.html">
            
                    
                    第一章：logback 介绍
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="02第二章架构.html">
            
                <a href="02第二章架构.html">
            
                    
                    第二章：架构
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="03第三章logback的配置.html">
            
                <a href="03第三章logback的配置.html">
            
                    
                    第三章：logback 的配置
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.5" data-path="04第四章Appenders.html">
            
                <a href="04第四章Appenders.html">
            
                    
                    第四章：Appenders
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6" data-path="05第五章Encoder.html">
            
                <a href="05第五章Encoder.html">
            
                    
                    第五章：Encoder
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7" data-path="06第六章Layouts.html">
            
                <a href="06第六章Layouts.html">
            
                    
                    第六章：Layouts
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8" data-path="07第七章Filters.html">
            
                <a href="07第七章Filters.html">
            
                    
                    第七章：Filters
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9" data-path="08第八章MDC.html">
            
                <a href="08第八章MDC.html">
            
                    
                    第八章：MDC
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10" data-path="09第九章日志隔离.html">
            
                <a href="09第九章日志隔离.html">
            
                    
                    第九章：日志隔离
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11" data-path="10第十章JMX配置器.html">
            
                <a href="10第十章JMX配置器.html">
            
                    
                    第十章：JMX 配置器
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12" data-path="11第十一章Joran.html">
            
                <a href="11第十一章Joran.html">
            
                    
                    第十一章：Joran
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.13" data-path="12第十二章Groovy配置.html">
            
                <a href="12第十二章Groovy配置.html">
            
                    
                    第十二章：Groovy 配置
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.14" data-path="13第十三章从log4j迁移.html">
            
                <a href="13第十三章从log4j迁移.html">
            
                    
                    第十三章：从 log4j 迁移
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.15" data-path="14第十四章Receivers.html">
            
                <a href="14第十四章Receivers.html">
            
                    
                    第十四章：Receivers
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.16" data-path="15第十五章使用SSL.html">
            
                <a href="15第十五章使用SSL.html">
            
                    
                    第十五章：使用 SSL
            
                </a>
            

            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            Published with GitBook
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="." >第四章：Appenders</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <h1 id="&#x7B2C;&#x56DB;&#x7AE0;&#xFF1A;appenders">&#x7B2C;&#x56DB;&#x7AE0;&#xFF1A;Appenders</h1>
<h2 id="&#x4EC0;&#x4E48;&#x662F;-appender">&#x4EC0;&#x4E48;&#x662F; Appender</h2>
<p>logback &#x5C06;&#x5199;&#x5165;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x4EFB;&#x52A1;&#x59D4;&#x6258;&#x7ED9;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; appender &#x7684;&#x7EC4;&#x4EF6;&#x3002;Appender &#x5FC5;&#x987B;&#x5B9E;&#x73B0; <a href="https://logback.qos.ch/xref/ch/qos/logback/core/Appender.html" target="_blank"><code>ch.qos.logback.core.Appender</code></a> &#x63A5;&#x53E3;&#x3002;&#x8BE5;&#x63A5;&#x53E3;&#x7684;&#x65B9;&#x6CD5;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> ch.qos.logback.core;

<span class="hljs-keyword">import</span> ch.qos.logback.core.spi.ContextAware;
<span class="hljs-keyword">import</span> ch.qos.logback.core.spi.FilterAttachable;
<span class="hljs-keyword">import</span> ch.qos.logback.core.spi.LifeCycle;


<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Appender</span>&lt;<span class="hljs-title">E</span>&gt; <span class="hljs-keyword">extends</span> <span class="hljs-title">LifeCycle</span>, <span class="hljs-title">ContextAware</span>, <span class="hljs-title">FilterAttachable</span> </span>{

    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span></span>;
      <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span><span class="hljs-params">(String name)</span></span>;
      <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">doAppend</span><span class="hljs-params">(E event)</span></span>;
}
</code></pre>
<p><code>doAppender()</code> &#x65B9;&#x6CD5;&#x63A5;&#x6536;&#x4E00;&#x4E2A;&#x6CDB;&#x578B;&#x53C2;&#x6570; <em>E</em> &#x4F5C;&#x4E3A;&#x552F;&#x4E00;&#x7684;&#x53C2;&#x6570;&#x3002;<em>E</em> &#x7684;&#x5B9E;&#x9645;&#x53C2;&#x6570;&#x7C7B;&#x578B;&#x53D6;&#x51B3;&#x4E8E; logback &#x6A21;&#x5757;&#x3002;&#x5728; logback-classic &#x6A21;&#x5757;&#x91CC;&#x9762;&#xFF0C;<em>E</em> &#x7684;&#x7C7B;&#x578B;&#x662F; <a href="https://logback.qos.ch/apidocs/ch/qos/logback/classic/spi/ILoggingEvent.html" target="_blank">ILoggingEvent</a> &#x3002;&#x5728; logback-access &#x6A21;&#x5757;&#x91CC;&#x9762;&#xFF0C;<em>E</em> &#x7684;&#x7C7B;&#x578B;&#x662F; <a href="https://logback.qos.ch/apidocs/ch/qos/logback/access/spi/AccessEvent.html" target="_blank">AccessEvent</a>&#x3002;<code>doAppend()</code> &#x662F; logback &#x6846;&#x67B6;&#x91CC;&#x9762;&#x6700;&#x91CD;&#x8981;&#x7684;&#x6A21;&#x5757;&#x3002;&#x5B83;&#x7684;&#x8D23;&#x4EFB;&#x662F;&#x5C06;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x8FDB;&#x884C;&#x683C;&#x5F0F;&#x5316;&#xFF0C;&#x7136;&#x540E;&#x8F93;&#x51FA;&#x5230;&#x5BF9;&#x5E94;&#x7684;&#x8BBE;&#x5907;&#x4E0A;&#x3002;</p>
<p>Appender &#x90FD;&#x662F;&#x5B9E;&#x4F53;&#x7C7B;&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x5B83;&#x4EEC;&#x901A;&#x8FC7;&#x540D;&#x5B57;&#x88AB;&#x5F15;&#x7528;&#x3002;<code>Appender</code> &#x63A5;&#x53E3;&#x7EE7;&#x627F;&#x4E86;  <code>FilterAttachable</code> &#x63A5;&#x53E3;&#x3002;&#x4F7F;&#x5F97;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x8FC7;&#x6EE4;&#x5668;&#x53EF;&#x4EE5;&#x9644;&#x52A0;&#x5230; appender &#x5B9E;&#x4F8B;&#x4E0A;&#x3002;</p>
<p>Appender &#x6700;&#x57FA;&#x672C;&#x7684;&#x8D23;&#x4EFB;&#x662F;&#x5C06;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x8FDB;&#x884C;&#x8F93;&#x51FA;&#x3002;&#x7136;&#x800C;&#xFF0C;&#x5B83;&#x4EEC;&#x53EF;&#x4EE5;&#x59D4;&#x6258; <code>Layout</code> &#x6216;&#x8005; <code>Encoder</code> &#x5BF9;&#x8C61;&#x6765;&#x5BF9;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x8FDB;&#x884C;&#x683C;&#x5F0F;&#x5316;&#x3002;&#x6BCF;&#x4E00;&#x4E2A; layout/encoder &#x6709;&#x4E14;&#x53EA;&#x4E0E;&#x4E00;&#x4E2A; appender &#x76F8;&#x5173;&#x8054;&#x3002;&#x4F8B;&#x5982;&#xFF0C;<code>SocketAppender</code> &#x4EC5;&#x4EC5;&#x5E8F;&#x5217;&#x5316;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x901A;&#x8FC7;&#x7EBF;&#x8DEF;&#x4F20;&#x8F93;&#x3002;</p>
<h2 id="appenderbase">AppenderBase</h2>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/AppenderBase.html" target="_blank"><code>ch.qos.logback.core.AppenderBase</code></a>  &#x662F;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7C7B;&#xFF0C;&#x5B9E;&#x73B0;&#x4E86; <code>Appender</code> &#x63A5;&#x53E3;&#x3002;&#x5B83;&#x63D0;&#x4F9B;&#x4E86;&#x57FA;&#x672C;&#x65B9;&#x6CD5;&#x4F9B;&#x6240;&#x6709; appender &#x4F7F;&#x7528;&#x3002;&#x4F8B;&#x5982;&#xFF1A;&#x83B7;&#x53D6;&#x6216;&#x8BBE;&#x7F6E;&#x540D;&#x79F0;&#x7684;&#x65B9;&#x6CD5;&#x3001;&#x6FC0;&#x6D3B;&#x72B6;&#x6001;&#x3001;&#x5E03;&#x5C40;&#x4EE5;&#x53CA;&#x8FC7;&#x6EE4;&#x5668;&#x3002;&#x5B83;&#x662F; logback &#x4E2D;&#x6240;&#x6709; appender &#x7684;&#x7236;&#x7C7B;&#x3002;&#x5C3D;&#x7BA1;&#x662F;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7C7B;&#xFF0C;&#x4F46;&#x662F; <code>AppenderBase</code> &#x8FD8;&#x5B9E;&#x73B0;&#x4E86; <code>Append</code> &#x63A5;&#x53E3;&#x4E2D; <code>doAppend()</code> &#x65B9;&#x6CD5;&#x3002;&#x53EF;&#x80FD;&#x9644;&#x4E0A;&#x6E90;&#x7801;&#x7684;&#x6458;&#x8981;&#x6765;&#x8BA8;&#x8BBA; <code>AppenderBase</code> &#x662F;&#x6700;&#x6E05;&#x695A;&#x7684;&#x65B9;&#x5F0F;&#x3002;</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doAppend</span><span class="hljs-params">(E eventObject)</span> </span>{

  <span class="hljs-comment">// prevent re-entry.</span>
  <span class="hljs-keyword">if</span> (guard) {
    <span class="hljs-keyword">return</span>;
  }

  <span class="hljs-keyword">try</span> {
    guard = <span class="hljs-keyword">true</span>;

    <span class="hljs-keyword">if</span> (!<span class="hljs-keyword">this</span>.started) {
      <span class="hljs-keyword">if</span> (statusRepeatCount++ &lt; ALLOWED_REPEATS) {
        addStatus(<span class="hljs-keyword">new</span> WarnStatus(
            <span class="hljs-string">&quot;Attempted to append to non started appender [&quot;</span> + name + <span class="hljs-string">&quot;].&quot;</span>,<span class="hljs-keyword">this</span>));
      }
      <span class="hljs-keyword">return</span>;
    }

    <span class="hljs-keyword">if</span> (getFilterChainDecision(eventObject) == FilterReply.DENY) {
      <span class="hljs-keyword">return</span>;
    }

    <span class="hljs-comment">// ok, we now invoke the derived class&apos;s implementation of append</span>
    <span class="hljs-keyword">this</span>.append(eventObject);

  } <span class="hljs-keyword">finally</span> {
    guard = <span class="hljs-keyword">false</span>;
  }
}
</code></pre>
<p><code>doAppend()</code> &#x7684;&#x5B9E;&#x73B0;&#x662F; synchronized &#x7684;&#x3002;&#x4E0D;&#x540C;&#x7684;&#x7EBF;&#x7A0B;&#x901A;&#x8FC7;&#x540C;&#x4E00;&#x4E2A; appender &#x6253;&#x5370;&#x65E5;&#x5FD7;&#x662F;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x7684;&#x3002;&#x5F53;&#x4E00;&#x4E2A;&#x7EBF;&#x7A0B; <em>T</em> &#x6B63;&#x5728;&#x6267;&#x884C; <code>doAppend()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x5176;&#x5B83;&#x7684;&#x7EBF;&#x7A0B;&#x8C03;&#x7528;&#x5C06;&#x4F1A;&#x88AB;&#x963B;&#x585E;&#x76F4;&#x5230;&#x7EBF;&#x7A0B; <em>T</em> &#x79BB;&#x5F00; <code>doAppend()</code> &#x65B9;&#x6CD5;&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x786E;&#x4FDD; <em>T</em> &#x5BF9; appender &#x7684;&#x8BBF;&#x95EE;&#x5177;&#x6709;&#x72EC;&#x5360;&#x6027;&#x3002;</p>
<p>&#x56E0;&#x4E3A;&#x8FD9;&#x79CD;&#x540C;&#x6B65;&#x5E76;&#x4E0D;&#x603B;&#x662F;&#x9002;&#x5408;&#x7684;&#xFF0C;&#x6240;&#x4EE5; logback &#x63D0;&#x4F9B;&#x4E86; <a href="https://logback.qos.ch/xref/ch/qos/logback/core/UnsynchronizedAppenderBase.html" target="_blank"><code>ch.qos.logback.core.UnsynchronizedAppenderBase</code></a> &#x7C7B;&#xFF0C;0&#x8DDF; <a href="https://logback.qos.ch/xref/ch/qos/logback/core/AppenderBase.html" target="_blank">AppenderBase</a> &#x7C7B;&#x5341;&#x5206;&#x7684;&#x76F8;&#x4F3C;&#x3002;&#x4E3A;&#x4E86;&#x7B80;&#x5355;&#x8D77;&#x89C1;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x5185;&#x5BB9;&#x6211;&#x4EEC;&#x53EA;&#x8BA8;&#x8BBA; <code>UnsynchronizedAppenderBase</code>&#x3002;</p>
<p>&#x9996;&#x5148;&#xFF0C;<code>doAppend()</code> &#x65B9;&#x6CD5;&#x4F1A;&#x53BB;&#x68C0;&#x67E5; <code>guard</code> &#x662F;&#x4E0D;&#x662F;&#x4E3A; true&#x3002;&#x5982;&#x679C;&#x662F;&#xFF0C;&#x5B83;&#x4F1A;&#x7ACB;&#x5373;&#x9000;&#x51FA;&#x3002;&#x5982;&#x679C; <code>guard</code> &#x4E0D;&#x662F;&#x4E3A; true&#xFF0C;&#x4E0B;&#x4E00;&#x6B65;&#x5C06;&#x5B83;&#x8BBE;&#x7F6E;&#x4E3A; true&#x3002;<code>guard</code> &#x4F1A;&#x786E;&#x4FDD; <code>doAppend()</code> &#x65B9;&#x6CD5;&#x4E0D;&#x4F1A;&#x88AB;&#x81EA;&#x8EAB;&#x9012;&#x5F52;&#x8C03;&#x7528;&#x3002;&#x60F3;&#x8C61;&#x4E00;&#x4E0B;&#x8FD9;&#x6837;&#x7684;&#x4E00;&#x4E2A;&#x7EC4;&#x4EF6;&#xFF0C;&#x88AB;&#x5728; <code>append()</code> &#x65B9;&#x6CD5;&#x4E4B;&#x5916;&#x7684;&#x5730;&#x65B9;&#x88AB;&#x8C03;&#x7528;&#xFF0C;&#x7528;&#x4E8E;&#x6253;&#x5370;&#x65E5;&#x5FD7;&#x3002;&#x5B83;&#x7684;&#x8C03;&#x7528;&#x53EF;&#x80FD;&#x88AB;&#x76F4;&#x63A5;&#x6307;&#x5411;&#x4E00;&#x4E2A;&#x5B8C;&#x5168;&#x76F8;&#x540C;&#x7684;&#x521A;&#x521A;&#x8C03;&#x7528;&#x8FC7;&#x5B83;&#x7684;&#x4E00;&#x4E2A;  appender&#xFF0C;&#x5BFC;&#x81F4;&#x65E0;&#x9650;&#x5FAA;&#x73AF;&#x548C;&#x5806;&#x6808;&#x6EA2;&#x51FA;&#x3002;</p>
<blockquote>
<p>&#x6CE8;&#xFF1A;<code>`UnsynchronizedAppenderBase</code> &#x7C7B;&#x4E2D;&#x6709;&#x4E00;&#x4E2A; <code>guard</code> &#x53D8;&#x91CF;</p>
<p><code>private ThreadLocal&lt;Boolean&gt; guard = new ThreadLocal&lt;Boolean&gt;();</code></p>
</blockquote>
<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x68C0;&#x67E5; <code>started</code> &#x662F;&#x5426;&#x4E3A; true&#x3002;&#x5982;&#x679C;&#x4E0D;&#x662F;&#xFF0C;<code>doAppend()</code> &#x4F1A;&#x53D1;&#x51FA;&#x4E00;&#x4E2A;&#x8B66;&#x544A;&#x5E76;&#x8FD4;&#x56DE;&#x3002;&#x6362;&#x53E5;&#x8BDD;&#x8BF4;&#xFF0C;&#x4E00;&#x65E6; appender &#x88AB;&#x5173;&#x95ED;&#xFF0C;&#x5C31;&#x4E0D;&#x80FD;&#x5BF9;&#x5B83;&#x8FDB;&#x884C;&#x5199;&#x5165;&#x3002;<code>Appender</code> &#x5BF9;&#x8C61;&#x5B9E;&#x73B0;&#x4E86; <code>LifeCycle</code> &#x63A5;&#x53E3;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x5B83;&#x5B9E;&#x73B0;&#x4E86; <code>start()</code>&#x3001;<code>stop()</code>&#x3001;<code>isStarted</code> &#x65B9;&#x6CD5;&#x3002;&#x5728;&#x8BBE;&#x7F6E;&#x5B8C;&#x4E00;&#x4E2A; appender &#x7684;&#x6240;&#x6709;&#x5C5E;&#x6027;&#x4E4B;&#x540E;&#xFF0C;logback &#x7684;&#x914D;&#x7F6E;&#x6846;&#x67B6; - Joran&#xFF0C;&#x5C06;&#x4F1A;&#x7ED9; appender &#x53D1;&#x4E00;&#x4E2A;&#x4FE1;&#x53F7;&#x53BB;&#x6FC0;&#x6D3B;&#x5B83;&#x7684;&#x5C5E;&#x6027;&#x3002;&#x6839;&#x636E;&#x5B83;&#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x4E00;&#x4E2A; appender &#x53EF;&#x80FD;&#x4F1A;&#x542F;&#x52A8;&#x5931;&#x8D25;&#xFF0C;&#x5982;&#x679C;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x5C5E;&#x6027;&#x4E22;&#x5931;&#x6216;&#x8005;&#x7531;&#x4E8E;&#x5404;&#x79CD;&#x5C5E;&#x6027;&#x4E4B;&#x95F4;&#x7684;&#x51B2;&#x7A81;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x4F9D;&#x8D56;&#x622A;&#x65AD;&#x6A21;&#x5F0F;&#xFF0C;<code>FileAppender</code> &#x4E0D;&#x80FD;&#x5BF9; <code>File</code> &#x9009;&#x9879;&#x7684;&#x503C;&#x8D77;&#x4F5C;&#x7528;&#xFF0C;&#x76F4;&#x5230;&#x8FD9;&#x4E2A;&#x503C;&#x786E;&#x5B9A;&#x4E0B;&#x6765;&#x3002;&#x660E;&#x786E;&#x7684;&#x6FC0;&#x6D3B;&#x6B65;&#x9AA4;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x4E00;&#x4E2A; appender &#x5728;&#x77E5;&#x9053;&#x5B83;&#x4EEC;&#x7684;&#x503C;&#x4E4B;&#x540E;&#x518D;&#x4F5C;&#x7528;&#x4E8E;&#x5176;&#x5C5E;&#x6027;&#x3002;</p>
<p>&#x5982;&#x679C; appender &#x4E0D;&#x80FD;&#x88AB;&#x88AB;&#x542F;&#x52A8;&#x6216;&#x8005;&#x88AB;&#x505C;&#x6B62;&#xFF0C;logback &#x5185;&#x90E8;&#x72B6;&#x6001;&#x7BA1;&#x7406;&#x7CFB;&#x7EDF;&#x5C06;&#x4F1A;&#x53D1;&#x51FA;&#x4E00;&#x6761;&#x8B66;&#x544A;&#x4FE1;&#x606F;&#x3002;&#x5728;&#x51E0;&#x6B21;&#x5C1D;&#x8BD5;&#x4E4B;&#x540E;&#xFF0C;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x88AB;&#x540C;&#x4E00;&#x6761;&#x8B66;&#x544A;&#x4FE1;&#x606F;&#x6DF9;&#x6CA1;&#x5185;&#x90E8;&#x72B6;&#x6001;&#x7CFB;&#x7EDF;&#xFF0C;<code>doAppend()</code> &#x4F1A;&#x505C;&#x6B62;&#x53D1;&#x51FA;&#x8FD9;&#x4E9B;&#x8B66;&#x544A;&#x3002;</p>
<p>&#x63A5;&#x4E0B;&#x6765; <code>if</code> &#x8BED;&#x53E5;&#x68C0;&#x67E5;&#x8FC7;&#x6EE4;&#x5668;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x6839;&#x636E;&#x8FC7;&#x6EE4;&#x5668;&#x94FE;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x4E8B;&#x4EF6;&#x53EF;&#x4EE5;&#x88AB;&#x62D2;&#x7EDD;&#x6216;&#x8005;&#x88AB;&#x63A5;&#x53D7;&#x3002;&#x5982;&#x679C;&#x7F3A;&#x5C11;&#x8FC7;&#x6EE4;&#x5668;&#x94FE;&#xFF0C;&#x4E8B;&#x4EF6;&#x9ED8;&#x8BA4;&#x4F1A;&#x88AB;&#x63A5;&#x53D7;&#x3002;</p>
<p>&#x63A5;&#x4E0B;&#x6765; <code>doAppend()</code> &#x8C03;&#x7528; <code>append()</code> &#x7684;&#x5B9E;&#x73B0;&#x65B9;&#x6CD5;&#x3002;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x662F;&#x5B9E;&#x9645;&#x7684;&#x6267;&#x884C;&#x8005;&#xFF0C;&#x7528;&#x6765;&#x5C06;&#x4E8B;&#x4EF6;&#x9644;&#x52A0;&#x5230;&#x5408;&#x9002;&#x7684;&#x8BBE;&#x5907;&#x4E0A;&#x3002;</p>
<p>&#x6700;&#x540E;&#xFF0C;<code>guard</code> &#x88AB;&#x91CA;&#x653E;&#xFF0C;&#x540E;&#x7EED;&#x5BF9; <code>append()</code> &#x7684;&#x8C03;&#x7528;&#x5F97;&#x4EE5;&#x6267;&#x884C;&#x3002;</p>
<p>&#x5728;&#x624B;&#x518C;&#x7684;&#x5176;&#x4F59;&#x90E8;&#x5206;&#xFF0C;&#x6211;&#x4EEC;&#x4FDD;&#x7559; <code>option</code> &#x4E0E; <code>property</code>&#xFF0C;&#x7528;&#x4E8E; JavaBean &#x901A;&#x8FC7; get &#x548C; set &#x65B9;&#x6CD5;&#x52A8;&#x6001;&#x63A8;&#x65AD;&#x51FA;&#x6765;&#x7684;&#x4EFB;&#x4F55;&#x5C5E;&#x6027;&#x3002;</p>
<h1 id="logback-core">Logback-core</h1>
<p>Logback-core &#x4E3A; logback &#x5176;&#x4ED6;&#x6A21;&#x5757;&#x7684;&#x6784;&#x5EFA;&#x5960;&#x5B9A;&#x4E86;&#x57FA;&#x7840;&#x3002;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;logback-core &#x7684;&#x7EC4;&#x4EF6;&#x9700;&#x8981;&#x4E00;&#x4E9B;&#x5B9A;&#x5236;&#xFF0C;&#x5C3D;&#x7BA1;&#x5F88;&#x5C11;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5728;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x51E0;&#x4E2A;&#x90E8;&#x5206;&#xFF0C;&#x6211;&#x4EEC;&#x63CF;&#x8FF0;&#x4E86;&#x4E00;&#x79CD;&#x53EF;&#x4EE5;&#x5F00;&#x7BB1;&#x5373;&#x7528;&#x7684; appender&#x3002;</p>
<h2 id="outputstreamappender">OutputStreamAppender</h2>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/OutputStreamAppender.html" target="_blank"><code>OutputStreamAppender</code></a> &#x5C06;&#x4E8B;&#x4EF6;&#x9644;&#x52A0;&#x5230; <code>java.io.OutputStream</code> &#x4E0A;&#x3002;&#x8FD9;&#x4E2A;&#x7C7B;&#x63D0;&#x4F9B;&#x4E86;&#x5176;&#x5B83; appender &#x6784;&#x5EFA;&#x7684;&#x57FA;&#x7840;&#x670D;&#x52A1;&#x3002;&#x7528;&#x6237;&#x901A;&#x5E38;&#x4E0D;&#x4F1A;&#x76F4;&#x63A5;&#x5B9E;&#x4F8B;&#x4E00;&#x4E2A; OutputStreamAppender &#x5B9E;&#x4F8B;&#x3002;&#x56E0;&#x4E3A;&#x4E00;&#x822C;&#x6765;&#x8BF4; <code>java.io.OutputStream</code> &#x7C7B;&#x578B;&#x4E0D;&#x80FD;&#x65B9;&#x4FBF;&#x7684;&#x8F6C;&#x4E3A; String&#x3002;&#x56E0;&#x4E3A;&#x5728;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x6CA1;&#x6709;&#x65B9;&#x6CD5;&#x53BB;&#x76F4;&#x63A5;&#x6307;&#x5B9A;&#x4E00;&#x4E2A; <code>OutputStream</code> &#x76EE;&#x6807;&#x5BF9;&#x8C61;&#x3002;&#x7B80;&#x5355;&#x6765;&#x8BF4;&#xFF0C;&#x4F60;&#x4E0D;&#x80FD;&#x901A;&#x8FC7;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x914D;&#x7F6E;&#x4E00;&#x4E2A; <code>OutputStreamAppender</code>&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x5E76;&#x4E0D;&#x610F;&#x5473;&#x7740; <code>OutputStreamAppender</code> &#x7F3A;&#x5C11;&#x914D;&#x7F6E;&#x5C5E;&#x6027;&#x3002;&#x8FD9;&#x4E9B;&#x5C5E;&#x6027;&#x63CF;&#x8FF0;&#x5982;&#x4E0B;&#xFF1A;</p>
<table>
<thead>
<tr>
<th style="text-align:center">&#x5C5E;&#x6027;&#x540D;</th>
<th style="text-align:center">&#x5C5E;&#x6027;&#x503C;</th>
<th style="text-align:center">&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">ecoder</td>
<td style="text-align:center"><a href="https://logback.qos.ch/xref/ch/qos/logback/core/encoder/Encoder.html" target="_blank"><code>Encoder</code></a></td>
<td style="text-align:center">&#x51B3;&#x5B9A;&#x901A;&#x8FC7;&#x54EA;&#x79CD;&#x65B9;&#x5F0F;&#x5C06;&#x4E8B;&#x4EF6;&#x5199;&#x5165; <code>OutputStreamAppender</code>&#xFF0C;Encoder &#x5C06;&#x4F1A;&#x5728;&#x5355;&#x72EC;&#x7684;&#x7AE0;&#x8282;&#x4ECB;&#x7ECD;</td>
</tr>
<tr>
<td style="text-align:center">immediateFlush</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center"><code>immediateFlush</code> &#x7684;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; true&#x3002;&#x7ACB;&#x5373;&#x5237;&#x65B0;&#x8F93;&#x51FA;&#x6D41;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x88AB;&#x7ACB;&#x5373;&#x5199;&#x5165;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x4FDD;&#x8BC1;&#x4E00;&#x65E6;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x6CA1;&#x6709;&#x6B63;&#x786E;&#x5173;&#x95ED; appender&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4E5F;&#x4E0D;&#x4F1A;&#x4E22;&#x5931;&#x3002;&#x4ECE;&#x53E6;&#x4E00;&#x65B9;&#x9762;&#x6765;&#x8BF4;&#xFF0C;&#x8BBE;&#x7F6E;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x4E3A; false&#xFF0C;&#x6709;&#x53EF;&#x80FD;&#x4F1A;&#x4F7F;&#x65E5;&#x5FD7;&#x7684;&#x541E;&#x5410;&#x91CF;&#x7FFB;&#x4E24;&#x756A;(&#x89C6;&#x60C5;&#x51B5;&#x800C;&#x5B9A;)&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x8BBE;&#x7F6E;&#x4E3A; false&#xFF0C;&#x5F53;&#x5E94;&#x7528;&#x9000;&#x51FA;&#x7684;&#x65F6;&#x5019;&#x6CA1;&#x6709;&#x6B63;&#x786E;&#x5173;&#x95ED; appender&#xFF0C;&#x4F1A;&#x5BFC;&#x81F4;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x6CA1;&#x6709;&#x88AB;&#x5199;&#x5165;&#x78C1;&#x76D8;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x4E22;&#x5931;&#x3002;</td>
</tr>
</tbody>
</table>
<p><code>OutputStreamAppender</code> &#x662F;&#x5176;&#x4ED6;&#x4E09;&#x4E2A; appender &#x7684;&#x7236;&#x7C7B;&#xFF0C;&#x5206;&#x522B;&#x662F; <code>ConsoleAppender</code>&#x3001;<code>FileAppender</code> &#x4EE5;&#x53CA; <code>RollingFileAppender</code>&#x3002;<code>FileAppender</code> &#x53C8;&#x662F; <code>RollingFileAppender</code> &#x7684;&#x7236;&#x7C7B;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x7C7B;&#x56FE;&#x5C55;&#x793A; <code>OutputStreamAppender</code> &#x4E0E;&#x5B50;&#x7C7B;&#x4E4B;&#x95F4;&#x7684;&#x5173;&#x7CFB;&#xFF1A;</p>
<p><img src="images/appenderClassDiagram.jpg" alt="appenderClassDiagram"></p>
<h2 id="consoleappender">ConsoleAppender</h2>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/ConsoleAppender.html" target="_blank"><code>ConsoleAppender</code></a> &#x5C31;&#x8DDF;&#x540D;&#x5B57;&#x663E;&#x793A;&#x7684;&#x4E00;&#x6837;&#xFF0C;&#x662F;&#x5C06;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x9644;&#x52A0;&#x5230;&#x63A7;&#x5236;&#x53F0;&#xFF0C;&#x8DDF;&#x8FDB;&#x4E00;&#x6B65;&#x8BF4;&#x5C31;&#x662F;&#x901A;&#x8FC7; <em>System.out</em> &#x6216;&#x8005; <em>System.err</em> &#x6765;&#x8FDB;&#x884C;&#x8F93;&#x51FA;&#x3002;&#x9ED8;&#x8BA4;&#x901A;&#x8FC7;&#x524D;&#x8005;&#x3002;<code>ConsoleAppender</code> &#x901A;&#x8FC7;&#x7528;&#x6237;&#x6307;&#x5B9A;&#x7684; encoder&#xFF0C;&#x683C;&#x5F0F;&#x5316;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;Encoder &#x4F1A;&#x5728;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x7AE0;&#x8282;&#x8BA8;&#x8BBA;&#x3002;<em>System.out</em> &#x4E0E; <em>System.err</em> &#x4E24;&#x8005;&#x90FD;&#x662F; <code>java.io.PrintStream</code> &#x7C7B;&#x578B;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5B83;&#x4EEC;&#x88AB;&#x5305;&#x88C5;&#x5728;&#x53EF;&#x4EE5;&#x8FDB;&#x884C; I/O &#x7F13;&#x5B58;&#x64CD;&#x4F5C;&#x7684; <code>OutputStreamWriter</code> &#x4E2D;&#x3002;</p>
<table>
<thead>
<tr>
<th style="text-align:center">&#x5C5E;&#x6027;&#x540D;</th>
<th style="text-align:center">&#x7C7B;&#x578B;</th>
<th style="text-align:center">&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">encoder</td>
<td style="text-align:center"><a href="https://logback.qos.ch/xref/ch/qos/logback/core/encoder/Encoder.html" target="_blank"><code>Encoder</code></a></td>
<td style="text-align:center">&#x89C1;  <code>OutputStreamAppender</code> &#x5C5E;&#x6027;</td>
</tr>
<tr>
<td style="text-align:center">target</td>
<td style="text-align:center">String</td>
<td style="text-align:center"><em>System.out</em> &#x6216; <em>System.err</em>&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; <em>System.out</em></td>
</tr>
<tr>
<td style="text-align:center">withJansi</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center"><code>withJansi</code> &#x7684;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; <code>false</code>&#x3002;&#x8BBE;&#x7F6E; <code>withJansi</code> &#x4E3A; <code>true</code> &#x53EF;&#x4EE5;&#x6FC0;&#x6D3B; <a href="http://jansi.fusesource.org/" target="_blank">Jansi</a> &#x5728; windows &#x4F7F;&#x7528; ANSI &#x5F69;&#x8272;&#x4EE3;&#x7801;&#x3002;&#x5728; windows &#x4E0A;&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A; true&#xFF0C;&#x4F60;&#x5E94;&#x8BE5;&#x5C06; <code>org.fusesource.jansi:jansi:1.9</code> &#x8FD9;&#x4E2A; jar &#x5305;&#x653E;&#x5230; classpath &#x4E0B;&#x3002;&#x57FA;&#x4E8E; Unix &#x5B9E;&#x73B0;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#xFF0C;&#x50CF; Linux&#x3001;Max OS X &#x90FD;&#x9ED8;&#x8BA4;&#x652F;&#x6301; ANSI &#x624D;&#x5F69;&#x8272;&#x4EE3;&#x7801;&#x3002;</td>
</tr>
</tbody>
</table>
<p><em>Example: ConsoleAppender configuraion (logback-Console.xml)</em></p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;STDOUT&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.ConsoleAppender&quot;</span> &gt;</span>
        <span class="hljs-comment">&lt;!-- encoder &#x9ED8;&#x8BA4;&#x4F7F;&#x7528; ch.qos.logback.classic.encoder.PatternLayoutEncoder --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%-4relative [%thread] %-5level %logger{35} - %msg %n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>    
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;STDOUT&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x6267;&#x884C;&#x4E0A;&#x9762;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF1A;</p>
<pre><code class="lang-shell">java chapters.appenders.ConfigurationTester logback-Console.xml
</code></pre>
<h2 id="fileappender">FileAppender</h2>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/FileAppender.html" target="_blank"><code>FileAppender</code></a> &#x662F; <code>OutputStreamAppender</code> &#x7684;&#x5B50;&#x7C7B;&#xFF0C;&#x5C06;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x8F93;&#x51FA;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#x3002;&#x901A;&#x8FC7; <code>file</code> &#x6765;&#x6307;&#x5B9A;&#x76EE;&#x6807;&#x6587;&#x4EF6;&#x3002;&#x5982;&#x679C;&#x8BE5;&#x6587;&#x4EF6;&#x5B58;&#x5728;&#xFF0C;&#x6839;&#x636E; <code>append</code> &#x7684;&#x503C;&#xFF0C;&#x8981;&#x4E48;&#x5C06;&#x65E5;&#x5FD7;&#x8FFD;&#x52A0;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x8981;&#x4E48;&#x8BE5;&#x6587;&#x4EF6;&#x88AB;&#x622A;&#x65AD;&#x3002;</p>
<table>
<thead>
<tr>
<th style="text-align:center">&#x5C5E;&#x6027;&#x540D;</th>
<th style="text-align:center">&#x7C7B;&#x578B;</th>
<th style="text-align:center">&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">append</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center">&#x5982;&#x679C;&#x4E3A; <code>true</code>&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4F1A;&#x88AB;&#x8FFD;&#x52A0;&#x5230;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x5426;&#x5219;&#x7684;&#x8BDD;&#xFF0C;&#x6587;&#x4EF6;&#x4F1A;&#x88AB;&#x622A;&#x65AD;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; <code>true</code></td>
</tr>
<tr>
<td style="text-align:center">encoder</td>
<td style="text-align:center"><a href="https://logback.qos.ch/xref/ch/qos/logback/core/encoder/Encoder.html" target="_blank"><code>Encoder</code></a></td>
<td style="text-align:center">&#x53C2;&#x89C1;  <code>OutputStreamAppender</code> &#x7684;&#x5C5E;&#x6027;</td>
</tr>
<tr>
<td style="text-align:center">file</td>
<td style="text-align:center">String</td>
<td style="text-align:center">&#x8981;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x7684;&#x540D;&#x79F0;&#x3002;&#x5982;&#x679C;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x65B0;&#x5EFA;&#x3002;&#x5728; windows &#x5E73;&#x53F0;&#x4E0A;&#xFF0C;&#x7528;&#x6237;&#x7ECF;&#x5E38;&#x5FD8;&#x8BB0;&#x5BF9;&#x53CD;&#x659C;&#x6760;&#x8FDB;&#x884C;&#x8F6C;&#x4E49;&#x3002;&#x4F8B;&#x5982;&#xFF0C;<em>c:\temp\test.log</em> &#x4E0D;&#x4F1A;&#x88AB;&#x6B63;&#x786E;&#x89E3;&#x6790;&#xFF0C;&#x56E0;&#x4E3A; <em>&apos;\t&apos;</em> &#x662F;&#x4E00;&#x4E2A;&#x8F6C;&#x4E49;&#x5B57;&#x7B26;&#xFF0C;&#x4F1A;&#x88AB;&#x89E3;&#x6790;&#x4E3A;&#x4E00;&#x4E2A; <em>tab</em> &#x5B57;&#x7B26; (\u0009)&#x3002;&#x6B63;&#x786E;&#x7684;&#x503C;&#x5E94;&#x8BE5;&#x50CF;&#xFF1A;<em>c:/temp/test.log</em> &#x6216;&#x8005; <em>c:\\temp\\test.log</em>&#x3002;&#x6CA1;&#x6709;&#x9ED8;&#x8BA4;&#x503C;&#x3002;</td>
</tr>
<tr>
<td style="text-align:center">prudent</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center">&#x5728;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x4E0B;&#xFF0C;<code>FileAppender</code> &#x4F1A;&#x5C06;&#x65E5;&#x5FD7;&#x5B89;&#x5168;&#x7684;&#x5199;&#x5165;&#x6307;&#x5B9A;&#x6587;&#x4EF6;&#x3002;&#x5373;&#x4F7F;&#x5728;&#x4E0D;&#x540C;&#x7684; JVM &#x6216;&#x8005;&#x4E0D;&#x540C;&#x7684;&#x4E3B;&#x673A;&#x4E0A;&#x8FD0;&#x884C; <code>FileAppender</code> &#x5B9E;&#x4F8B;&#x3002;&#x9ED8;&#x8BA4;&#x7684;&#x503C;&#x4E3A; <code>false</code>&#x3002;<br>&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x4E0E; <code>RollingFileAppender</code> &#x7ED3;&#x5408;&#x4F7F;&#x7528;&#x3002;<br>&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x4E5F;&#x610F;&#x5473;&#x7740; <code>append</code> &#x5C5E;&#x6027;&#x88AB;&#x81EA;&#x52A8;&#x8BBE;&#x7F6E;&#x4E3A; <code>true</code>&#x3002;<br>&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x4F9D;&#x8D56;&#x6392;&#x4ED6;&#x6587;&#x4EF6;&#x9501;&#x3002;&#x5B9E;&#x9A8C;&#x8BC1;&#x660E;&#xFF0C;&#x6587;&#x4EF6;&#x9501;&#x5927;&#x6982;&#x662F;&#x5199;&#x5165;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x6210;&#x672C;&#x7684; 3 &#x500D;&#x3002;&#x5728;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x5173;&#x95ED;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5F80;&#x4E00;&#x53F0;&quot;&#x666E;&#x901A;&quot;&#x7535;&#x8111;&#x7684;&#x786C;&#x76D8;&#x4E0A;&#x5C06;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5199;&#x5165;&#x6587;&#x4EF6;&#xFF0C;&#x5927;&#x6982;&#x9700;&#x8981;&#x8017;&#x8D39; 10 &#x5FAE;&#x79D2;&#x3002;&#x4F46;&#x662F;&#x5728;&#x5F00;&#x542F;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5927;&#x6982;&#x9700;&#x8981; 30 &#x5FAE;&#x79D2;&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x5728;&#x5173;&#x95ED;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x53EF;&#x4EE5;&#x4E00;&#x79D2;&#x949F;&#x5199;&#x5165; 100&apos;000 &#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#xFF0C;&#x4F46;&#x662F;&#x5728;&#x5F00;&#x542F;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E00;&#x79D2;&#x949F;&#x53EA;&#x80FD;&#x5199;&#x5165;33&apos;000 &#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;<br>&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x53EF;&#x4EE5;&#x5728;&#x6240;&#x6709; JVM &#x5199;&#x5165;&#x540C;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x65F6;&#xFF0C;&#x6709;&#x6548;&#x7684;&#x5E8F;&#x5217;&#x5316; I/O &#x64CD;&#x4F5C;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x968F;&#x7740;&#x7ADE;&#x76F8;&#x8BBF;&#x95EE;&#x540C;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x7684; JVM &#x6570;&#x91CF;&#x4E0A;&#x5347;&#xFF0C;&#x5C06;&#x4F1A;&#x5EF6;&#x8FDF;&#x6BCF;&#x4E00;&#x4E2A; I/O &#x64CD;&#x4F5C;&#x3002;&#x53EA;&#x8981;&#x603B;&#x5171;&#x7684; I/O &#x64CD;&#x4F5C;&#x5927;&#x7EA6;&#x4E3A;&#x6BCF;&#x79D2; 20 &#x4E2A;&#x65E5;&#x5FD7;&#x8BF7;&#x6C42;&#xFF0C;&#x5BF9;&#x6027;&#x80FD;&#x7684;&#x5F71;&#x54CD;&#x53EF;&#x4EE5;&#x88AB;&#x5FFD;&#x7565;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x5E94;&#x7528;&#x6BCF;&#x79D2;&#x4EA7;&#x751F;&#x4E86; 100 &#x4E2A;&#x4EE5;&#x4E0A;&#x7684; I/O &#x64CD;&#x4F5C;&#xFF0C;&#x6027;&#x80FD;&#x4F1A;&#x53D7;&#x5230;&#x660E;&#x663E;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x5E94;&#x8BE5;&#x907F;&#x514D;&#x4F7F;&#x7528;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x3002;<br><code>&#x7F51;&#x7EDC;&#x6587;&#x4EF6;&#x9501;</code> &#x5F53;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x4F4D;&#x4E8E;&#x7F51;&#x7EDC;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x4E0A;&#x65F6;&#xFF0C;&#x4E25;&#x8C28;&#x6A21;&#x5F0F;&#x7684;&#x6210;&#x672C;&#x4F1A;&#x66F4;&#x9AD8;&#x3002;&#x540C;&#x6837;&#x91CD;&#x8981;&#x7684;&#x662F;&#xFF0C;&#x7F51;&#x7EDC;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x7684;&#x6587;&#x4EF6;&#x9501;&#x5E26;&#x6709;&#x5F88;&#x5F3A;&#x7684;&#x504F;&#x5411;&#x6027;&#xFF0C;&#x5F53;&#x524D;&#x83B7;&#x5F97;&#x9501;&#x7684;&#x8FDB;&#x7A0B;&#x5728;&#x91CA;&#x653E;&#x9501;&#x4E4B;&#x540E;&#x4F1A;&#x7ACB;&#x9A6C;&#x53C8;&#x91CD;&#x65B0;&#x83B7;&#x5F97;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5F53;&#x4E00;&#x4E2A;&#x8FDB;&#x7A0B;&#x72EC;&#x5360;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#xFF0C;&#x5C06;&#x4F1A;&#x5BFC;&#x81F4;&#x5176;&#x5B83;&#x8FDB;&#x7A0B;&#x9965;&#x997F;&#x6B7B;&#x9501;&#x3002;<br>&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x7684;&#x5F71;&#x54CD;&#x4E25;&#x91CD;&#x4F9D;&#x8D56;&#x7F51;&#x901F;&#x4EE5;&#x53CA;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x5B9E;&#x73B0;&#x7684;&#x7EC6;&#x8282;&#x3002;&#x6211;&#x4EEC;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x5C0F;&#x578B;&#x5E94;&#x7528;  <a href="https://gist.github.com/2794241" target="_blank">FileLockSimulator</a> &#x7528;&#x4E8E;&#x5728;&#x4F60;&#x7684;&#x73AF;&#x5883;&#x4E2D;&#x6A21;&#x62DF;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x3002;</td>
</tr>
</tbody>
</table>
<p><code>&#x7ACB;&#x5373;&#x5237;&#x65B0;</code> &#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x90FD;&#x4F1A;&#x88AB;&#x7ACB;&#x5373;&#x5237;&#x65B0;&#x5230;&#x5E95;&#x5C42;&#x7684;&#x8F93;&#x51FA;&#x6D41;&#x3002;&#x9ED8;&#x8BA4;&#x65B9;&#x6CD5;&#x66F4;&#x52A0;&#x7684;&#x5B89;&#x5168;&#xFF0C;&#x56E0;&#x4E3A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5728;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x6CA1;&#x6709;&#x6B63;&#x786E;&#x5173;&#x95ED; appender &#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x4E0D;&#x4F1A;&#x4E22;&#x5931;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x8981;&#x60F3;&#x663E;&#x8457;&#x7684;&#x589E;&#x52A0;&#x65E5;&#x5FD7;&#x7684;&#x541E;&#x5410;&#x7387;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5C06; <code>immediateFlush</code> &#x8BBE;&#x7F6E;&#x4E3A; <code>false</code>&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x662F; <code>FileAppender</code> &#x7684;&#x914D;&#x7F6E;&#x793A;&#x4F8B;&#xFF1A;</p>
<blockquote>
<p>Example: logback-fileAppender.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.FileAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>testFile.log<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
<span class="hljs-comment">&lt;!--         &#x5C06; immediateFlush &#x8BBE;&#x7F6E;&#x4E3A; false &#x53EF;&#x4EE5;&#x83B7;&#x5F97;&#x66F4;&#x9AD8;&#x7684;&#x65E5;&#x5FD7;&#x541E;&#x5410;&#x91CF; --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">immediateFlush</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">immediateFlush</span>&gt;</span>
<span class="hljs-comment">&lt;!--         &#x9ED8;&#x8BA4;&#x4E3A; ch.qos.logback.classic.encoder.PatternLayoutEncoder --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%-4relative [%thread] %-5level %logger{35} - %msg%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;FILE&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x5728; <em>logback-examples</em> &#x7684;&#x6587;&#x4EF6;&#x5939;&#x4E0B;&#xFF0C;&#x8FD0;&#x884C;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p>
<pre><code class="lang-bash">java chapters.appenders.ConfigurationTester logback-fileAppender.xml
</code></pre>
<blockquote>
<p>&#x8981;&#x6307;&#x5B9A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x5177;&#x4F53;&#x8DEF;&#x5F84;</p>
<p>&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728; eclipse &#x91CC;&#x9762; Run Application &#x65F6;&#x8BBE;&#x7F6E; Arguments</p>
</blockquote>
<h3 id="&#x6587;&#x4EF6;&#x552F;&#x4E00;&#x547D;&#x540D;-&#x4F7F;&#x7528;&#x65F6;&#x95F4;&#x6233;">&#x6587;&#x4EF6;&#x552F;&#x4E00;&#x547D;&#x540D; (&#x4F7F;&#x7528;&#x65F6;&#x95F4;&#x6233;)</h3>
<p>&#x5728;&#x5E94;&#x7528;&#x7684;&#x5F00;&#x53D1;&#x9636;&#x6BB5;&#x6216;&#x8005;&#x77ED;&#x671F;&#x5E94;&#x7528;&#x4E2D;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;&#x6279;&#x5904;&#x7406;&#x7A0B;&#x5E8F;&#xFF0C;&#x5728;&#x6BCF;&#x4E2A;&#x5E94;&#x7528;&#x542F;&#x52A8;&#x7684;&#x65F6;&#x5019;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x3002;&#x901A;&#x8FC7; <code>&lt;timestamp&gt;</code> &#x5143;&#x7D20;&#x53EF;&#x4EE5;&#x8F7B;&#x6613;&#x505A;&#x5230;&#x8FD9;&#x70B9;&#x3002;</p>
<blockquote>
<p>Example: logback-timestamp.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
<span class="hljs-comment">&lt;!--     &#x901A;&#x8FC7; &quot;bySecond&quot; &#x5C06;&#x65F6;&#x95F4;&#x683C;&#x5F0F;&#x5316;&#x6210; &quot;yyyyMMdd&apos;T&apos;HHmmss&quot; &#x7684;&#x5F62;&#x5F0F;&#x63D2;&#x5165;&#x5230; logger &#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x4E2D; 
        &#x8FD9;&#x4E2A;&#x503C;&#x5BF9;&#x540E;&#x7EED;&#x7684;&#x914D;&#x7F6E;&#x4E5F;&#x9002;&#x7528;
--&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">timestamp</span> <span class="hljs-attr">key</span>=<span class="hljs-string">&quot;bySecond&quot;</span> <span class="hljs-attr">datePattern</span>=<span class="hljs-string">&quot;yyyyMMdd&apos;T&apos;HHmmss&quot;</span> /&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.FileAppender&quot;</span>&gt;</span>
<span class="hljs-comment">&lt;!--         &#x5229;&#x7528;&#x4E4B;&#x524D;&#x521B;&#x5EFA;&#x7684; timestamp &#x6765;&#x521B;&#x5EFA;&#x552F;&#x4E00;&#x7684;&#x6587;&#x4EF6; --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>log-${bySecond}.txt<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%logger{35} - %msg%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;FILE&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p><code>timestamp</code> &#x5143;&#x7D20;&#x9700;&#x8981;&#x4E24;&#x4E2A;&#x5F3A;&#x5236;&#x7684;&#x5C5E;&#x6027; <em>key</em> &#x8DDF; <em>datePattern</em> &#x4EE5;&#x53CA;&#x53EF;&#x9009;&#x7684;&#x5C5E;&#x6027; <em>timeReference</em>&#x3002;<em>key</em> &#x5C5E;&#x6027;&#x7684;&#x503C;&#x662F;&#x6765;&#x533A;&#x5206;&#x54EA;&#x4E2A; timestamp &#x5143;&#x7D20;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x540E;&#x7EED;&#x7684;&#x914D;&#x7F6E;&#x4E2D;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;<a href="&#x53D8;&#x91CF;&#x66FF;&#x6362;">TODO &#x53D8;&#x91CF;&#x66FF;&#x6362;</a>&#x6765;&#x4F7F;&#x7528;&#x3002;<em>datePattern</em> &#x5C5E;&#x6027;&#x7528;&#x4E8E;&#x5C06;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#x683C;&#x5F0F;&#x5316;&#x6210;&#x5B57;&#x7B26;&#x4E32;&#x3002;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#x5FC5;&#x987B;&#x9075;&#x5FAA; <a href="https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html" target="_blank">SimpleDateFormat</a> &#x4E2D;&#x7684;&#x89C4;&#x8303;&#x3002;<em>timeReference</em> &#x8868;&#x793A;&#x65F6;&#x95F4;&#x6233;&#x5F15;&#x7528;&#x54EA;&#x4E2A;&#x65F6;&#x95F4;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A;&#x89E3;&#x6790;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5728;&#x4E00;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A;&#x4E0A;&#x4E0B;&#x6587;&#x521D;&#x59CB;&#x5316;&#x7684;&#x65F6;&#x95F4;&#x3002;&#x901A;&#x8FC7; &#x8BBE;&#x7F6E; <em>timeReference</em> &#x7684;&#x503C;&#x4E3A; <code>contextBirth</code>&#x3002;</p>
<p>&#x901A;&#x8FC7;&#x4E00;&#x4E0B;&#x547D;&#x4EE4;&#x6765;&#x6D4B;&#x8BD5; <code>&lt;timestamp&gt;</code> &#x5143;&#x7D20;&#xFF1A;</p>
<pre><code class="lang-bash">java chapters.appenders.ConfigurationTester logback-timestamp.xml
</code></pre>
<blockquote>
<p>&#x8BD1;&#x8005;&#x6CE8;&#xFF1A;&#x9700;&#x8981;&#x6307;&#x5B9A;&#x5177;&#x4F53;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x5177;&#x4F53;&#x8DEF;&#x5F84;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; eclipse &#x6765;&#x8FD0;&#x884C;&#x3002;&#x540E;&#x7EED;&#x4E0D;&#x518D;&#x91CD;&#x590D;&#x6B64;&#x6CE8;&#x610F;&#x4E8B;&#x9879;&#x3002;</p>
</blockquote>
<p>&#x8BBE;&#x7F6E; <em>timeReference</em> &#x7684;&#x503C;&#x4E3A; &quot;contextBirth&quot; &#x7684;&#x4F8B;&#x5B50;&#x5982;&#x4E0B;&#xFF1A;</p>
<blockquote>
<p>Example: logback-timestamp-contextBirth.xml</p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">timestamp</span> <span class="hljs-attr">key</span>=<span class="hljs-string">&quot;bySecond&quot;</span> <span class="hljs-attr">datePattern</span>=<span class="hljs-string">&quot;yyyyMMdd&apos;T&apos;HHmmss&quot;</span> <span class="hljs-attr">timeReference</span>=<span class="hljs-string">&quot;contextBirth&quot;</span>/&gt;</span>
    ...
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h2 id="rollingfileappender">RollingFileAppender</h2>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/rolling/RollingFileAppender.html" target="_blank"><code>RollingFileAppender</code></a> &#x7EE7;&#x627F;&#x81EA;<code>FileAppender</code>&#xFF0C;&#x5177;&#x6709;&#x8F6E;&#x8F6C;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x7684;&#x529F;&#x80FD;&#x3002;&#x4F8B;&#x5982;&#xFF0C;<code>RollingFileAppender</code> &#x5C06;&#x65E5;&#x5FD7;&#x8F93;&#x51FA;&#x5230; <em>log.txt</em> &#x6587;&#x4EF6;&#xFF0C;&#x5728;&#x6EE1;&#x8DB3;&#x4E86;&#x7279;&#x5B9A;&#x7684;&#x6761;&#x4EF6;&#x4E4B;&#x540E;&#xFF0C;&#x5C06;&#x65E5;&#x5FD7;&#x8F93;&#x51FA;&#x5230;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x3002;</p>
<p>&#x4E0E; <code>RollingFileAppender</code> &#x8FDB;&#x884C;&#x4EA4;&#x4E92;&#x7684;&#x6709;&#x4E24;&#x4E2A;&#x91CD;&#x8981;&#x7684;&#x5B50;&#x7EC4;&#x4EF6;&#x3002;&#x7B2C;&#x4E00;&#x4E2A;&#x662F; <code>RollingPolicy</code>&#xFF0C;&#x5B83;&#x8D1F;&#x8D23;&#x65E5;&#x5FD7;&#x8F6E;&#x8F6C;&#x7684;&#x529F;&#x80FD;&#x3002;&#x53E6;&#x4E00;&#x4E2A;&#x662F; <code>TriggeringPolicy</code>&#xFF0C;&#x5B83;&#x8D1F;&#x8D23;&#x65E5;&#x5FD7;&#x8F6E;&#x8F6C;&#x7684;&#x65F6;&#x673A;&#x3002;&#x6240;&#x4EE5; <code>RollingPolicy</code> &#x8D1F;&#x8D23;&#x53D1;&#x751F;&#x4EC0;&#x4E48;&#xFF0C;<code>TriggeringPolicy</code> &#x8D1F;&#x8D23;&#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x53D1;&#x751F;&#x3002;</p>
<p>&#x4E3A;&#x4E86;&#x8BA9; <code>RollingFileAppender</code> &#x751F;&#x6548;&#xFF0C;&#x5FC5;&#x987B;&#x540C;&#x65F6;&#x8BBE;&#x7F6E; <code>RollingPolicy</code> &#x4E0E; <code>TriggeringPolicy</code>&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5982;&#x679C; <code>RollingPolicy</code> &#x4E5F;&#x5B9E;&#x73B0;&#x4E86; <code>TriggeringPolicy</code> &#x63A5;&#x53E3;&#xFF0C;&#x90A3;&#x4E48;&#x53EA;&#x9700;&#x8981;&#x8BBE;&#x7F6E;&#x524D;&#x4E00;&#x4E2A;&#x5C31;&#x597D;&#x4E86;&#x3002;</p>
<p><code>RollingFileAppender</code> &#x7684;&#x5C5E;&#x6027;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<table>
<thead>
<tr>
<th style="text-align:center">&#x5C5E;&#x6027;&#x540D;</th>
<th style="text-align:center">&#x7C7B;&#x578B;</th>
<th style="text-align:center">&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">file</td>
<td style="text-align:center">String</td>
<td style="text-align:center">&#x53C2;&#x89C1; <code>FileAppender</code></td>
</tr>
<tr>
<td style="text-align:center">append</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center">&#x53C2;&#x89C1; <code>FileAppender</code></td>
</tr>
<tr>
<td style="text-align:center">encoder</td>
<td style="text-align:center"><a href="https://logback.qos.ch/xref/ch/qos/logback/core/encoder/Encoder.html" target="_blank"><code>Encoder</code></a></td>
<td style="text-align:center">&#x53C2;&#x89C1;  <code>OutputStreamAppender</code></td>
</tr>
<tr>
<td style="text-align:center">rollingPolicy</td>
<td style="text-align:center">RollingPolicy</td>
<td style="text-align:center">&#x5F53;&#x8F6E;&#x8F6C;&#x53D1;&#x751F;&#x65F6;&#xFF0C;&#x6307;&#x5B9A; <code>RollingFileAppender</code> &#x7684;&#x884C;&#x4E3A;&#x3002;&#x4E0B;&#x9762;&#x5C06;&#x4F1A;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;</td>
</tr>
<tr>
<td style="text-align:center">triggeringPolicy</td>
<td style="text-align:center">TriggeringPolicy</td>
<td style="text-align:center">&#x544A;&#x8BC9; <code>RollingFileAppender</code> &#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x53D1;&#x751F;&#x8F6E;&#x8F6C;&#x884C;&#x4E3A;&#x3002;&#x4E0B;&#x9762;&#x5C06;&#x4F1A;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;</td>
</tr>
<tr>
<td style="text-align:center">prudent</td>
<td style="text-align:center">boolean</td>
<td style="text-align:center"><a href="#FixedWindowRollingPolicy"><code>FixedWindowRollingPolicy</code></a> &#x4E0D;&#x652F;&#x6301;&#x8BE5;&#x5C5E;&#x6027;&#x3002;<br><code>RollingFileAppender</code> &#x5728;&#x4F7F;&#x7528;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x65F6;&#x8981;&#x4E0E;  <a href="#TimeBasedRollingPolicy">`TimeBasedRollingPolicy</a> &#x7ED3;&#x5408;&#x4F7F;&#x7528;&#xFF0C;&#x4F46;&#x662F;&#x6709;&#x4E24;&#x4E2A;&#x9650;&#x5236;&#xFF1A;<br>1. &#x5728;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x4E0B;&#xFF0C;&#x4E5F;&#x4E0D;&#x652F;&#x6301;&#x4E5F;&#x4E0D;&#x5141;&#x8BB8;&#x6587;&#x4EF6;&#x538B;&#x7F29;&#xFF08;&#x6211;&#x4EEC;&#x4E0D;&#x80FD;&#x8BA9;&#x4E00;&#x4E2A; JVM &#x5728;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x65F6;&#xFF0C;&#x53E6;&#x4E00;&#x4E2A; JVM &#x5728;&#x538B;&#x7F29;&#x8BE5;&#x6587;&#x4EF6;&#xFF09;<br>2. &#x4E0D;&#x80FD;&#x5BF9; <code>FileAppender</code> &#x7684; <code>file</code> &#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;&#x5927;&#x591A;&#x6570;&#x7684;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x4E0D;&#x5141;&#x8BB8;&#x5728;&#x6709;&#x8FDB;&#x7A0B;&#x64CD;&#x4F5C;&#x6587;&#x4EF6;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x5BF9;&#x6587;&#x4EF6;&#x6539;&#x540D;&#x3002;<br>&#x5176;&#x5B83;&#x7684;&#x53C2;&#x8003; <code>FileAppender</code></td>
</tr>
</tbody>
</table>
<h3 id="rolling-policy-&#x7B80;&#x4ECB;">Rolling policy &#x7B80;&#x4ECB;</h3>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/rolling/RollingPolicy.html" target="_blank"><code>RollingPolicy</code></a> &#x8D1F;&#x8D23;&#x8F6E;&#x8F6C;&#x7684;&#x65B9;&#x5F0F;&#x4E3A;&#xFF1A;&#x79FB;&#x52A8;&#x6587;&#x4EF6;&#x4EE5;&#x53CA;&#x5BF9;&#x6587;&#x4EF6;&#x6539;&#x540D;&#x3002;</p>
<p><code>RollingPolicy</code> &#x63A5;&#x53E3;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> ch.qos.logback.core.rolling;  

<span class="hljs-keyword">import</span> ch.qos.logback.core.FileAppender;
<span class="hljs-keyword">import</span> ch.qos.logback.core.spi.LifeCycle;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">RollingPolicy</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">LifeCycle</span> </span>{

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">rollover</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> RolloverFailure</span>;
    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getActiveFileName</span><span class="hljs-params">()</span></span>;
    <span class="hljs-function"><span class="hljs-keyword">public</span> CompressionMode <span class="hljs-title">getCompressionMode</span><span class="hljs-params">()</span></span>;
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setParent</span><span class="hljs-params">(FileAppender appender)</span></span>;
}
</code></pre>
<p><code>rollover</code> &#x65B9;&#x6CD5;&#x8D1F;&#x8D23;&#x5BF9;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x5F52;&#x6863;&#x3002;<code>getActiveFileName()</code> &#x65B9;&#x6CD5;&#x8D1F;&#x8D23;&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x7684;&#x540D;&#x5B57;&#x3002;<code>getCompressionMode</code> &#x65B9;&#x6CD5;&#x51B3;&#x5B9A;&#x91C7;&#x53D6;&#x54EA;&#x79CD;&#x538B;&#x7F29;&#x6A21;&#x5F0F;&#x3002;&#x901A;&#x8FC7; <code>setParent</code> &#x65B9;&#x6CD5;&#x5F15;&#x7528;&#x7236;&#x7C7B;&#x3002;</p>
<h4 id="timebasedrollingpolicy">TimeBasedRollingPolicy</h4>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.html" target="_blank"><code>TimeBasedRollingPolicy</code></a> &#x662F;&#x6700;&#x5E38;&#x7528;&#x7684;&#x8F6E;&#x8F6C;&#x7B56;&#x7565;&#x3002;&#x5B83;&#x662F;&#x57FA;&#x4E8E;&#x65F6;&#x95F4;&#x6765;&#x5B9A;&#x4E49;&#x8F6E;&#x8F6C;&#x7B56;&#x7565;&#x3002;&#x4F8B;&#x5982;&#x6309;&#x5929;&#x6216;&#x8005;&#x6309;&#x6708;&#x3002;<code>TimeBasedRollingPolicy</code> &#x65E2;&#x8D1F;&#x8D23;&#x8F6E;&#x8F6C;&#x7684;&#x884C;&#x4E3A;&#xFF0C;&#x4E5F;&#x8D1F;&#x8D23;&#x89E6;&#x53D1;&#x8F6E;&#x8F6C;&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;<code>TimeBasedRollingPolicy</code> &#x540C;&#x65F6;&#x5B9E;&#x73B0;&#x4E86; <code>RollingPolicy</code> &#x4E0E; <code>TriggeringPolicy</code> &#x63A5;&#x53E3;&#x3002;</p>
<p><code>TimeBasedRollingPolicy</code> &#x7684;&#x914D;&#x7F6E;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x5F3A;&#x5236;&#x7684;&#x5C5E;&#x6027; <code>fileNamePattern</code> &#x4EE5;&#x53CA;&#x5176;&#x5B83;&#x7684;&#x53EF;&#x9009;&#x5C5E;&#x6027;&#x3002;</p>
<table>
<thead>
<tr>
<th style="text-align:center">&#x5C5E;&#x6027;&#x540D;</th>
<th style="text-align:center">&#x7C7B;&#x578B;</th>
<th style="text-align:left">&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">fileNamePattern</td>
<td style="text-align:center">String</td>
<td style="text-align:left">&#x8BE5;&#x5C5E;&#x6027;&#x5B9A;&#x4E49;&#x4E86;&#x8F6E;&#x8F6C;&#x65F6;&#x7684;&#x5C5E;&#x6027;&#x540D;&#x3002;&#x5B83;&#x7684;&#x503C;&#x5E94;&#x8BE5;&#x7531;&#x6587;&#x4EF6;&#x540D;&#x52A0;&#x4E0A;&#x4E00;&#x4E2A; <em>%d</em> &#x7684;&#x5360;&#x4F4D;&#x7B26;&#x3002;<em>%d</em> &#x5E94;&#x8BE5;&#x5305;&#x542B;  java.text.SimpleDateFormat &#x4E2D;&#x89C4;&#x5B9A;&#x7684;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#x3002;&#x5982;&#x679C;&#x7701;&#x7565;&#x6389;&#x8FD9;&#x4E2A;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x9ED8;&#x8BA4;&#x4E3A; <em>yyyy-MM-dd</em>&#x3002;&#x8F6E;&#x8F6C;&#x5468;&#x671F;&#x662F;&#x901A;&#x8FC7;  <strong>fileNamePattern</strong> &#x63A8;&#x65AD;&#x51FA;&#x6765;&#x7684;&#x3002;<br> <br>&#x6CE8;&#x610F;&#xFF1A;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x5BF9; <code>RollingFileAppender</code>&#xFF08;<code>TimeBasedRollingPolicy</code> &#x7684;&#x7236;&#x7C7B;&#xFF09;&#x4E2D;&#x7684; <code>file</code> &#x5C5E;&#x6027;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5FFD;&#x7565;&#x3002;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; <code>FileAppender</code> &#x7684; <code>file</code> &#x5C5E;&#x6027;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5C06;&#x5F53;&#x524D;&#x6D3B;&#x52A8;&#x65E5;&#x5FD7;&#x7684;&#x8DEF;&#x5F84;&#x4E0E;&#x5F52;&#x6863;&#x65E5;&#x5FD7;&#x7684;&#x8DEF;&#x5F84;&#x5206;&#x9694;&#x5F00;&#x6765;&#x3002;&#x5F53;&#x524D;&#x65E5;&#x5FD7;&#x6C38;&#x8FDC;&#x4F1A;&#x662F;&#x901A;&#x8FC7; <code>file</code> &#x6307;&#x5B9A;&#x7684;&#x6587;&#x4EF6;&#x3002;&#x5B83;&#x7684;&#x540D;&#x5B57;&#x4E0D;&#x4F1A;&#x968F;&#x7740;&#x65F6;&#x95F4;&#x7684;&#x63A8;&#x79FB;&#x800C;&#x53D1;&#x751F;&#x53D8;&#x5316;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x9009;&#x62E9;&#x5FFD;&#x7565; <code>file</code> &#x5C5E;&#x6027;&#xFF0C;&#x5F53;&#x524D;&#x6D3B;&#x52A8;&#x65E5;&#x5FD7;&#x5728;&#x6BCF;&#x4E2A;&#x5468;&#x671F;&#x5185;&#x5C06;&#x4F1A;&#x6839;&#x636E; <code>fileNamePattern</code> &#x7684;&#x503C;&#x53D8;&#x5316;&#x3002;&#x7A0D;&#x540E;&#x7684;&#x4F8B;&#x5B50;&#x5C06;&#x4F1A;&#x8BF4;&#x660E;&#x8FD9;&#x4E00;&#x70B9;&#x3002;<br><em>%d{}</em> &#x4E2D;&#x7684;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#x5C06;&#x4F1A;&#x9075;&#x5FAA;  java.text.SimpleDateFormat &#x4E2D;&#x7684;&#x7EA6;&#x5B9A;&#x3002;&#x659C;&#x6746; &apos;/&apos; &#x6216;&#x8005;&#x53CD;&#x659C;&#x6760; &apos;\&apos; &#x90FD;&#x4F1A;&#x88AB;&#x89E3;&#x6790;&#x6210;&#x76EE;&#x5F55;&#x5206;&#x9694;&#x7B26;&#x3002;<br><br><strong>&#x6307;&#x5B9A;&#x591A;&#x4E2A; %d</strong><br><br>&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x591A;&#x4E2A; %d&#xFF0C;&#x4F46;&#x662F;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;&#x662F;&#x4E3B;&#x8981;&#x7684;&#xFF0C;&#x7528;&#x4E8E;&#x63A8;&#x65AD;&#x8F6E;&#x8F6C;&#x5468;&#x671F;&#x3002;&#x5176;&#x5B83;&#x7684; %d &#x5360;&#x4F4D;&#x7B26;&#x5FC5;&#x987B;&#x901A;&#x8FC7; &apos;aux&apos; &#x6807;&#x8BB0;&#x4E3A;&#x8F85;&#x52A9;&#x7684;&#x3002;&#x89C1;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#xFF1A;<br>&#x591A;&#x4E2A; %d &#x5360;&#x4F4D;&#x7B26;&#x5141;&#x8BB8;&#x4F60;&#x5728;&#x6587;&#x4EF6;&#x5939;&#x4E2D;&#x53BB;&#x7BA1;&#x7406;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#xFF0C;&#x8FD9;&#x4E2A;&#x8DDF;&#x8F6E;&#x8F6C;&#x5468;&#x671F;&#x4E0D;&#x540C;&#x3002;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;&#x901A;&#x8FC7;&#x5E74;&#x6708;&#x6765;&#x7BA1;&#x7406;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x4F46;&#x662F;&#x8F6E;&#x8F6C;&#x5468;&#x671F;&#x662F;&#x5728;&#x6BCF;&#x5929;&#x665A;&#x4E0A;&#x96F6;&#x70B9;&#x3002;<br>/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log<br><br><strong>TimeZone</strong><br><br>&#x5728;&#x67D0;&#x4E9B;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4F60;&#x53EF;&#x80FD;&#x60F3;&#x8981;&#x6839;&#x636E;&#x65F6;&#x533A;&#x800C;&#x4E0D;&#x662F;&#x4E3B;&#x673A;&#x7684;&#x65F6;&#x949F;&#x6765;&#x8F6E;&#x8F6C;&#x65E5;&#x5FD7;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5982;&#x4E0B;&#x65B9;&#x5F0F;&#x6765;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x65F6;&#x533A;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;<br>aFloder/test.%d{yyyy-MM-dd-HH, UTC}.log<br>&#x5982;&#x679C;&#x6307;&#x5B9A;&#x7684; timezone &#x4E0D;&#x80FD;&#x88AB;&#x8BC6;&#x522B;&#x6216;&#x8005;&#x62FC;&#x5199;&#x9519;&#x8BEF;&#xFF0C;&#x5C06;&#x4F1A;&#x6839;&#x636E;  <a href="http://docs.oracle.com/javase/6/docs/api/java/util/TimeZone.html#getTimeZone(java.lang.String" target="_blank">TimeZone.getTimeZone(String)</a>) &#x65B9;&#x6CD5;&#x6307;&#x5B9A;&#x4E3A; GMT&#x3002;</td>
</tr>
<tr>
<td style="text-align:center">maxHistory</td>
<td style="text-align:center">int</td>
<td style="text-align:left">&#x8FD9;&#x4E2A;&#x53EF;&#x9009;&#x7684;&#x5C5E;&#x6027;&#x7528;&#x6765;&#x63A7;&#x5236;&#x6700;&#x591A;&#x4FDD;&#x7559;&#x591A;&#x5C11;&#x6570;&#x91CF;&#x7684;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#xFF0C;&#x5C06;&#x4F1A;&#x5F02;&#x6B65;&#x5220;&#x9664;&#x65E7;&#x7684;&#x6587;&#x4EF6;&#x3002;&#x6BD4;&#x5982;&#xFF0C;&#x4F60;&#x6307;&#x5B9A;&#x6309;&#x6708;&#x8F6E;&#x8F6C;&#xFF0C;&#x6307;&#x5B9A; maxHistory = 6&#xFF0C;&#x90A3;&#x4E48; 6 &#x4E2A;&#x6708;&#x5185;&#x7684;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x5C06;&#x4F1A;&#x4FDD;&#x7559;&#x5728;&#x6587;&#x4EF6;&#x5939;&#x5185;&#xFF0C;&#x5927;&#x4E8E; 6 &#x4E2A;&#x6708;&#x7684;&#x5C06;&#x4F1A;&#x88AB;&#x5220;&#x9664;&#x3002;&#x6CE8;&#x610F;&#xFF1A;&#x5F53;&#x65E7;&#x7684;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x88AB;&#x79FB;&#x9664;&#x65F6;&#xFF0C;&#x5F53;&#x521D;&#x7528;&#x6765;&#x4FDD;&#x5B58;&#x8FD9;&#x4E9B;&#x65E5;&#x5FD7;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x4E5F;&#x4F1A;&#x5728;&#x9002;&#x5F53;&#x7684;&#x65F6;&#x5019;&#x88AB;&#x79FB;&#x9664;&#x3002;</td>
</tr>
<tr>
<td style="text-align:center">totalSizeCap</td>
<td style="text-align:center">int</td>
<td style="text-align:left">&#x8FD9;&#x4E2A;&#x53EF;&#x9009;&#x5C5E;&#x6027;&#x7528;&#x6765;&#x63A7;&#x5236;&#x6240;&#x6709;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x603B;&#x7684;&#x5927;&#x5C0F;&#x3002;&#x5F53;&#x8FBE;&#x5230;&#x8FD9;&#x4E2A;&#x5927;&#x5C0F;&#x540E;&#xFF0C;&#x65E7;&#x7684;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x5C06;&#x4F1A;&#x88AB;&#x5F02;&#x6B65;&#x7684;&#x5220;&#x9664;&#x3002;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x65F6;&#x8FD8;&#x9700;&#x8981;&#x8BBE;&#x7F6E; maxHistory &#x5C5E;&#x6027;&#x3002;&#x800C;&#x4E14;&#xFF0C;maxHistory &#x5C06;&#x4F1A;&#x88AB;&#x4F5C;&#x4E3A;&#x7B2C;&#x4E00;&#x6761;&#x4EF6;&#xFF0C;&#x8BE5;&#x5C5E;&#x6027;&#x4F5C;&#x4E3A;&#x7B2C;&#x4E8C;&#x6761;&#x4EF6;&#x3002;</td>
</tr>
<tr>
<td style="text-align:center">cleanHistoryOnStart</td>
<td style="text-align:center">boolean</td>
<td style="text-align:left">&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A; true&#xFF0C;&#x90A3;&#x4E48;&#x5728; appender &#x542F;&#x52A8;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x5C06;&#x4F1A;&#x88AB;&#x5220;&#x9664;&#x3002;&#x9ED8;&#x8BA4;&#x7684;&#x503C;&#x4E3A; false&#x3002;<br>&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x7684;&#x5220;&#x9664;&#x901A;&#x5E38;&#x5728;&#x8F6E;&#x8F6C;&#x671F;&#x95F4;&#x6267;&#x884C;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x6709;&#x4E9B;&#x5E94;&#x7528;&#x7684;&#x5B58;&#x6D3B;&#x65F6;&#x95F4;&#x53EF;&#x80FD;&#x7B49;&#x4E0D;&#x5230;&#x8F6E;&#x8F6C;&#x89E6;&#x53D1;&#x3002;&#x5BF9;&#x4E8E;&#x8FD9;&#x79CD;&#x77ED;&#x671F;&#x5E94;&#x7528;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E;&#x8BE5;&#x5C5E;&#x6027;&#x4E3A; true&#xFF0C;&#x5728; appender &#x542F;&#x52A8;&#x7684;&#x65F6;&#x5019;&#x6267;&#x884C;&#x5220;&#x9664;&#x64CD;&#x4F5C;&#x3002;</td>
</tr>
</tbody>
</table>
<p>&#x4E0B;&#x9762;&#x662F;&#x5173;&#x4E8E; <code>fileNamePattern</code> &#x7684;&#x4ECB;&#x7ECD;&#x3002;</p>
<table>
<thead>
<tr>
<th>fileNamePattern</th>
<th>&#x8F6E;&#x8F6C;&#x5468;&#x671F;</th>
<th>&#x793A;&#x4F8B;</th>
</tr>
</thead>
<tbody>
<tr>
<td><em>/wombat/foo.%d</em></td>
<td>&#x6BCF;&#x5929;&#x8F6E;&#x8F6C;&#xFF08;&#x665A;&#x4E0A;&#x96F6;&#x70B9;&#xFF09;&#x3002;&#x7531;&#x4E8E;&#x7701;&#x7565;&#x4E86;&#x6307;&#x5B9A; %d &#x7684;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#xFF0C;&#x6240;&#x4EE5;&#x9ED8;&#x8BA4;&#x4E3A; <em>yyyy-MM-dd</em></td>
<td>&#x6CA1;&#x6709;&#x8BBE;&#x7F6E; <code>file</code> &#x5C5E;&#x6027;&#xFF1A;&#x5728; 2006.11.23 &#x8FD9;&#x4E00;&#x5929;&#x7684;&#x65E5;&#x5FD7;&#x90FD;&#x4F1A;&#x8F93;&#x51FA;&#x5230; <em>/wombat/foo.2006-11-23</em> &#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x3002;&#x665A;&#x4E0A;&#x96F6;&#x70B9;&#x4EE5;&#x540E;&#xFF0C;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x8F93;&#x51FA;&#x5230; <em>wombat/foo.2016-11-24</em> &#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x3002;<br>&#x8BBE;&#x7F6E; <code>file</code> &#x7684;&#x503C;&#x4E3A; <em>/wombat/foo.txt</em>&#xFF1A;&#x5728; 2016.11.23 &#x8FD9;&#x4E00;&#x5929;&#x7684;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x8F93;&#x51FA;&#x5230; <em>/wombat/foo.txt</em> &#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x3002;&#x5728;&#x665A;&#x4E0A;&#x96F6;&#x70B9;&#x7684;&#x65F6;&#x5019;&#xFF0C;<em>foo.txt</em> &#x5C06;&#x4F1A;&#x88AB;&#x6539;&#x540D;&#x4E3A; <em>/wombat/foo.2016-11-23</em>&#x3002;&#x7136;&#x540E;&#x5C06;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <em>foo.txt</em>&#xFF0C;11.24 &#x53F7;&#x8FD9;&#x4E00;&#x5929;&#x7684;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x8F93;&#x51FA;&#x5230;&#x8FD9;&#x4E2A;&#x65B0;&#x7684;&#x6587;&#x4EF6;&#x4E2D;&#x3002;</td>
</tr>
<tr>
<td><em>/wombat/%d{yyyy/MM}/foo.txt</em></td>
<td>&#x6BCF;&#x4E2A;&#x6708;&#x5F00;&#x59CB;&#x7684;&#x65F6;&#x5019;&#x8F6E;&#x8F6C;</td>
<td>&#x6CA1;&#x6709;&#x8BBE;&#x7F6E; <code>file</code> &#x5C5E;&#x6027;&#xFF1A;&#x5728; 2016.10 &#x8FD9;&#x4E00;&#x4E2A;&#x6708;&#x4E2D;&#x7684;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x8F93;&#x51FA;&#x5230; <em>/wombat/2006/10/foo.txt</em>&#x3002;&#x5728; 10.31 &#x665A;&#x4E0A;&#x51CC;&#x6668;&#x4EE5;&#x540E;&#xFF0C;11 &#x6708;&#x4EFD;&#x7684;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x88AB;&#x8F93;&#x51FA;&#x5230; <em>/wombat/2006/11/foo.txt</em>&#x3002;<br>&#x8BBE;&#x7F6E; <code>file</code> &#x7684;&#x503C;&#x4E3A; <em>/wombat/foo.txt</em>&#xFF1A;&#x5728; 2016.10&#xFF0C;&#x8FD9;&#x4E2A;&#x6708;&#x4EFD;&#x7684;&#x65E5;&#x5FD7;&#x90FD;&#x4F1A;&#x8F93;&#x51FA;&#x5230; <em>/wombat/foo.txt</em>&#x3002;&#x5728; 10.31 &#x665A;&#x4E0A;&#x96F6;&#x70B9;&#x7684;&#x65F6;&#x5019;&#xFF0C;<em>/wombat/foo.txt</em> &#x5C06;&#x4F1A;&#x88AB;&#x91CD;&#x547D;&#x540D;&#x4E3A; <em>/wombat/2006/10/foo.txt</em>&#xFF0C;&#x5E76;&#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x6587;&#x4EF6; <em>/wombat/foo.txt</em> &#xFF0C;11 &#x6708;&#x4EFD;&#x7684;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x8F93;&#x51FA;&#x5230;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x3002;&#x4F9D;&#x6B64;&#x7C7B;&#x63A8;&#x3002;</td>
</tr>
<tr>
<td><em>/wombat/foo.%d{yyyy-ww}.log</em></td>
<td>&#x6BCF;&#x5468;&#x7684;&#x7B2C;&#x4E00;&#x5929;&#xFF08;&#x53D6;&#x51B3;&#x4E8E;&#x65F6;&#x533A;&#xFF09;</td>
<td>&#x6BCF;&#x6B21;&#x8F6E;&#x8F6C;&#x53D1;&#x751F;&#x5728;&#x6BCF;&#x5468;&#x7684;&#x7B2C;&#x4E00;&#x5929;&#xFF0C;&#x5176;&#x5B83;&#x7684;&#x8DDF;&#x4E0A;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x7C7B;&#x4F3C;</td>
</tr>
<tr>
<td><em>/wombat/foo%d{yyyy-MM-dd_HH}.log</em></td>
<td>&#x6BCF;&#x5C0F;&#x65F6;&#x8F6E;&#x8F6C;</td>
<td>&#x8DDF;&#x4E4B;&#x524D;&#x7684;&#x4F8B;&#x5B50;&#x7C7B;&#x4F3C;</td>
</tr>
<tr>
<td><em>/wombat/foo%d{yyyy-MM-dd_HH-mm}.log</em></td>
<td>&#x6BCF;&#x5206;&#x949F;&#x8F6E;&#x8F6C;</td>
<td>&#x8DDF;&#x4E4B;&#x524D;&#x7684;&#x4F8B;&#x5B50;&#x7C7B;&#x4F3C;</td>
</tr>
<tr>
<td><em>/wombat/foo%d{yyyy-MM-dd_HH-mm, UTC}.log</em></td>
<td>&#x6BCF;&#x5206;&#x949F;&#x8F6E;&#x8F6C;</td>
<td>&#x8DDF;&#x4E4B;&#x524D;&#x7684;&#x4F8B;&#x5B50;&#x7C7B;&#x4F3C;&#xFF0C;&#x4E0D;&#x8FC7;&#x65F6;&#x95F4;&#x683C;&#x5F0F;&#x662F; UTC</td>
</tr>
<tr>
<td><em>/foo/%d{yyyy-MM, aux}/%d.log</em></td>
<td>&#x6BCF;&#x5929;&#x8F6E;&#x8F6C;&#x3002;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x5728;&#x5305;&#x542B;&#x5E74;&#x6708;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x4E0B;</td>
<td>&#x7B2C;&#x4E00;&#x4E2A; %d &#x88AB;&#x8F85;&#x52A9;&#x6807;&#x8BB0;&#x3002;&#x7B2C;&#x4E8C;&#x4E2A; %d &#x4E3A;&#x4E3B;&#x8981;&#x6807;&#x8BB0;&#xFF0C;&#x4F46;&#x662F;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#x7701;&#x7565;&#x4E86;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x8F6E;&#x8F6C;&#x5468;&#x671F;&#x4E3A;&#x6BCF;&#x5929;&#xFF08;&#x7531;&#x7B2C;&#x4E8C;&#x4E2A; %d &#x63A7;&#x5236;&#xFF09;&#xFF0C;&#x6587;&#x4EF6;&#x5939;&#x7684;&#x540D;&#x5B57;&#x4F9D;&#x8D56;&#x5E74;&#x4E0E;&#x6708;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5728; 2016.11 &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x90FD;&#x4F1A;&#x5728; <em>/foo/2006-11/</em> &#x6587;&#x4EF6;&#x5939;&#x4E0B;&#xFF0C;&#x5982;&#xFF1A;<em>/foo/2006-11/2006-11-14.log</em></td>
</tr>
</tbody>
</table>
<p>&#x4EFB;&#x4F55;&#x659C;&#x6746;&#x6216;&#x8005;&#x53CD;&#x659C;&#x6760;&#x591F;&#x4F1A;&#x88AB;&#x5F53;&#x4F5C;&#x6587;&#x4EF6;&#x5939;&#x5206;&#x9694;&#x7B26;&#x3002;&#x4EFB;&#x4F55;&#x5FC5;&#x8981;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x90FD;&#x4F1A;&#x5728;&#x6709;&#x9700;&#x8981;&#x7684;&#x65F6;&#x5019;&#x521B;&#x5EFA;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x8F7B;&#x677E;&#x7684;&#x5C06;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x653E;&#x5728;&#x5355;&#x72EC;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x4E2D;&#x3002;</p>
<p><code>TimeBasedRollingPolicy</code> &#x652F;&#x6301;&#x6587;&#x4EF6;&#x81EA;&#x52A8;&#x538B;&#x7F29;&#x3002;&#x5982;&#x679C; <code>fileNamePattern</code> &#x4EE5; <em>.gz</em> &#x6216;&#x8005; <em>.zip</em> &#x7ED3;&#x5C3E;&#xFF0C;&#x5C06;&#x4F1A;&#x542F;&#x52A8;&#x8FD9;&#x4E2A;&#x7279;&#x6027;&#x3002;</p>
<table>
<thead>
<tr>
<th>fileNamePattern</th>
<th>&#x8F6E;&#x8F6C;&#x5468;&#x671F;</th>
<th>&#x793A;&#x4F8B;</th>
</tr>
</thead>
<tbody>
<tr>
<td><em>/wombat/foo.%d.gz</em></td>
<td>&#x6BCF;&#x5929;&#x8F6E;&#x8F6C;&#xFF08;&#x665A;&#x4E0A;&#x96F6;&#x70B9;&#xFF09;&#xFF0C;&#x81EA;&#x52A8;&#x5C06;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x538B;&#x7F29;&#x6210; GZIP &#x683C;&#x5F0F;</td>
<td><code>file</code> &#x5C5E;&#x6027;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E;&#xFF1A;&#x5728; 2009.11.23&#xFF0C;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x88AB;&#x8F93;&#x51FA;&#x5230; <em>/wombat/foo.2009-11-23</em> &#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5728;&#x665A;&#x4E0A;&#x96F6;&#x70B9;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6587;&#x4EF6;&#x5C06;&#x4F1A;&#x88AB;&#x538B;&#x7F29;&#x6210; <em>/wombat/foo.2009-11-23.gz</em>&#x3002;&#x5728; 11.24&#xFF0C;&#x8FD9;&#x4E00;&#x5929;&#x7684;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x88AB;&#x76F4;&#x63A5;&#x8F93;&#x51FA;&#x5230; <em>/wombat/folder/foo.2009-11-24</em> &#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x3002;<br><code>file</code> &#x5C5E;&#x6027;&#x7684;&#x503C;&#x8BBE;&#x7F6E;&#x4E3A; <em>/wombat/foo.txt</em>&#xFF1A;&#x5728; 2009.11.23&#xFF0C;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x88AB;&#x8F93;&#x51FA;&#x5230; <em>/wombat/foo.txt</em> &#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x3002;&#x5728;&#x665A;&#x4E0A;&#x96F6;&#x70B9;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x8BE5;&#x6587;&#x4EF6;&#x4F1A;&#x88AB;&#x538B;&#x7F29;&#x6210; <em>/wombat/foo.2009-11-23.gz</em>&#x3002;&#x5E76;&#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <em>/wombat/foo.txt</em> &#x6587;&#x4EF6;&#xFF0C;11.24 &#x8FD9;&#x4E00;&#x5929;&#x7684;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x88AB;&#x8F93;&#x51FA;&#x5230;&#x8BE5;&#x6587;&#x4EF6;&#x3002;&#x4F9D;&#x6B64;&#x7C7B;&#x63A8;&#x3002;</td>
</tr>
</tbody>
</table>
<p> <code>fileNamePattern</code> &#x6709;&#x4E24;&#x4E2A;&#x76EE;&#x7684;&#x3002;logback &#x901A;&#x8FC7;&#x8BE5;&#x5C5E;&#x6027;&#x53EF;&#x4EE5;&#x8FDB;&#x884C;&#x5468;&#x671F;&#x6027;&#x7684;&#x8F6E;&#x8F6C;&#x5E76;&#x4E14;&#x5F97;&#x5230;&#x6BCF;&#x4E2A;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x7684;&#x540D;&#x5B57;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x4E24;&#x79CD;&#x8DDF;&#x4E0D;&#x540C;&#x7684; pattern &#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x76F8;&#x540C;&#x7684;&#x8F6E;&#x8F6C;&#x5468;&#x671F;&#x3002;<em>yyyy-MM</em> &#x4E0E; <em>yyyy@MM</em> &#x540C;&#x6837;&#x90FD;&#x662F;&#x6309;&#x6708;&#x8F6E;&#x8F6C;&#xFF0C;&#x4F46;&#x662F;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x6700;&#x7EC8;&#x7684;&#x540D;&#x5B57;&#x4E0D;&#x4E00;&#x6837;&#x3002;</p>
<p>&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; <code>file</code> &#x5C5E;&#x6027;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5C06;&#x6D3B;&#x52A8;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x7684;&#x8DEF;&#x5F84;&#x4E0E;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x7684;&#x8DEF;&#x5F84;&#x5206;&#x9694;&#x5F00;&#x6765;&#x3002;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x4E00;&#x76F4;&#x8F93;&#x51FA;&#x5230;&#x901A;&#x8FC7; <code>file</code> &#x5C5E;&#x6027;&#x6307;&#x5B9A;&#x7684;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x5E76;&#x4E14;&#x4E0D;&#x4F1A;&#x968F;&#x7740;&#x65F6;&#x95F4;&#x800C;&#x6539;&#x53D8;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x9009;&#x62E9;&#x5FFD;&#x7565; <code>file</code> &#x5C5E;&#x6027;&#xFF0C;&#x6D3B;&#x52A8;&#x65E5;&#x5FD7;&#x7684;&#x540D;&#x5B57;&#x5C06;&#x4F1A;&#x6839;&#x636E; <code>fileNamePattern</code> &#x7684;&#x503C;&#x5728;&#x6BCF;&#x4E2A;&#x5468;&#x671F;&#x5185;&#x53D8;&#x5316;&#x3002;&#x4E0D;&#x8BBE;&#x7F6E; <code>file</code> &#x5C5E;&#x6027;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5982;&#x679C;&#x5728;&#x8F6E;&#x8F6C;&#x671F;&#x95F4;&#x5B58;&#x5728;&#x5916;&#x90E8;&#x6587;&#x4EF6;&#x53E5;&#x67C4;&#x5F15;&#x7528;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#xFF0C;&#x5C06;&#x4F1A;&#x907F;&#x514D;<a href="https://logback.qos.ch/codes.html#renamingError" target="_blank">&#x547D;&#x540D;&#x9519;&#x8BEF;</a>&#x3002;</p>
<p><code>maxHistory</code> &#x63A7;&#x5236;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x4FDD;&#x7559;&#x7684;&#x6700;&#x5927;&#x6570;&#x76EE;&#xFF0C;&#x5E76;&#x5220;&#x9664;&#x65E7;&#x7684;&#x6587;&#x4EF6;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x6307;&#x5B9A;&#x6309;&#x6708;&#x8F6E;&#x8F6C;&#xFF0C;&#x5E76;&#x8BBE;&#x5B9A; <code>maxHistory</code> &#x7684;&#x503C;&#x4E3A; 6&#xFF0C;&#x90A3;&#x4E48; 6 &#x4E2A;&#x6708;&#x4E4B;&#x5185;&#x7684;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x90FD;&#x4F1A;&#x88AB;&#x4FDD;&#x7559;&#xFF0C;&#x5927;&#x4E8E; 6 &#x4E2A;&#x6708;&#x7684;&#x6587;&#x4EF6;&#x5C06;&#x4F1A;&#x88AB;&#x5220;&#x9664;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x5F53;&#x65E7;&#x7684;&#x6587;&#x4EF6;&#x88AB;&#x79FB;&#x9664;&#x65F6;&#xFF0C;&#x4E3A;&#x6587;&#x4EF6;&#x5F52;&#x6863;&#x800C;&#x521B;&#x5EFA;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x5728;&#x9002;&#x5F53;&#x7684;&#x65F6;&#x5019;&#x4E5F;&#x4F1A;&#x88AB;&#x79FB;&#x9664;&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x5404;&#x79CD;&#x6280;&#x672F;&#x539F;&#x56E0;&#xFF0C;&#x8F6E;&#x8F6C;&#x5E76;&#x4E0D;&#x662F;&#x65F6;&#x95F4;&#x9A71;&#x52A8;&#x7684;&#xFF0C;&#x800C;&#x662F;&#x4F9D;&#x8D56;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5728; 2002.03.08&#xFF0C;&#x5047;&#x8BBE; <code>fileNamePattern</code> &#x7684;&#x503C;&#x4E3A; <em>yyyy-MM-dd</em>&#xFF08;&#x6309;&#x5929;&#x8F6E;&#x8F6C;&#xFF09;&#xFF0C;&#x5728;&#x665A;&#x4E0A;&#x96F6;&#x70B9;&#x4E4B;&#x540E;&#xFF0C;&#x6CA1;&#x6709;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5230;&#x6765;&#xFF0C;&#x5047;&#x8BBE;&#x5728; 23 &#x5206; 47 &#x79D2;&#x4E4B;&#x540E;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x5230;&#x8FBE;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5C06;&#x4F1A;&#x89E6;&#x53D1;&#x8F6E;&#x8F6C;&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x8F6E;&#x8F6C;&#x5B9E;&#x9645;&#x53D1;&#x751F;&#x5728; 03.09 00:23&apos;47 AM &#x800C;&#x4E0D;&#x662F; 0:00 AM&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x4F9D;&#x8D56;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x5230;&#x8FBE;&#x901F;&#x5EA6;&#xFF0C;&#x6240;&#x4EE5;&#x8F6E;&#x8F6C;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x5EF6;&#x8FDF;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x4E0D;&#x7BA1;&#x5EF6;&#x8FDF;&#x7684;&#x60C5;&#x51B5;&#x662F;&#x4EC0;&#x4E48;&#x6837;&#xFF0C;&#x4E00;&#x5B9A;&#x5468;&#x671F;&#x5185;&#x751F;&#x6210;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5C06;&#x4F1A;&#x88AB;&#x8F93;&#x51FA;&#x5230;&#x6307;&#x5B9A;&#x7684;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x4ECE;&#x8FD9;&#x4E2A;&#x89D2;&#x5EA6;&#x6765;&#x770B;&#xFF0C;&#x8F6E;&#x8F6C;&#x7B97;&#x6CD5;&#x59CB;&#x7EC8;&#x90FD;&#x4F1A;&#x662F;&#x6B63;&#x786E;&#x7684;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x662F; <code>RollingFileAppender</code> &#x4E0E; <code>TimeBaseRollingPolicy</code> &#x7ED3;&#x5408;&#x4F7F;&#x7528;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p>
<blockquote>
<p><em>Example: logback-RollingTimeBased.xml</em></p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>logFile.log<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">rollingPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;</span>&gt;</span>
<span class="hljs-comment">&lt;!--             &#x6309;&#x5929;&#x8F6E;&#x8F6C; --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">fileNamePattern</span>&gt;</span>logFile.%d{yyyy-MM-dd}.log<span class="hljs-tag">&lt;/<span class="hljs-name">fileNamePattern</span>&gt;</span>
<span class="hljs-comment">&lt;!--             &#x4FDD;&#x5B58; 30 &#x5929;&#x7684;&#x5386;&#x53F2;&#x8BB0;&#x5F55;&#xFF0C;&#x6700;&#x5927;&#x5927;&#x5C0F;&#x4E3A; 30GB --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">maxHistory</span>&gt;</span>30<span class="hljs-tag">&lt;/<span class="hljs-name">maxHistory</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">totalSizeCap</span>&gt;</span>3GB<span class="hljs-tag">&lt;/<span class="hljs-name">totalSizeCap</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">rollingPolicy</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%-4relative [%thread] %-5level %logger{35} - %msg%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;FILE&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x4E0B;&#x9762;&#x662F;&#x5728; <code>prudent</code> &#x6A21;&#x5F0F;&#x4E0B;&#xFF08;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#xFF09;<code>RollingFileAppender</code> &#x4E0E; <code>TimeBasedRollingPolicy</code> &#x7684;&#x7ED3;&#x5408;&#x4F7F;&#x7528;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p>
<blockquote>
<p>Example: logback-PrudentTimeBasedRolling.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;</span>&gt;</span>
        <span class="hljs-comment">&lt;!-- &#x652F;&#x6301;&#x591A;&#x4E2A; JVM &#x540C;&#x65F6;&#x5199;&#x4E00;&#x4E2A;&#x6587;&#x4EF6; --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">prudent</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">prudent</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">rollingPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&quot;</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">fileNamePattern</span>&gt;</span>logFile.%d{yyyy-MM-dd}.log<span class="hljs-tag">&lt;/<span class="hljs-name">fileNamePattern</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">maxHistory</span>&gt;</span>30<span class="hljs-tag">&lt;/<span class="hljs-name">maxHistory</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">totalSizeCap</span>&gt;</span>3GB<span class="hljs-tag">&lt;/<span class="hljs-name">totalSizeCap</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">rollingPolicy</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%-4relative [%thread] %-5level %logger{35} - %msg%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;FILE&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h3 id="&#x57FA;&#x4E8E;&#x5927;&#x5C0F;&#x4EE5;&#x53CA;&#x65F6;&#x95F4;&#x7684;&#x8F6E;&#x8F6C;&#x7B56;&#x7565;">&#x57FA;&#x4E8E;&#x5927;&#x5C0F;&#x4EE5;&#x53CA;&#x65F6;&#x95F4;&#x7684;&#x8F6E;&#x8F6C;&#x7B56;&#x7565;</h3>
<p>&#x6709;&#x65F6;&#x4F60;&#x5E0C;&#x671B;&#x6309;&#x65F6;&#x8F6E;&#x8F6C;&#xFF0C;&#x4F46;&#x540C;&#x65F6;&#x53C8;&#x60F3;&#x9650;&#x5236;&#x6BCF;&#x4E2A;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x7684;&#x5927;&#x5C0F;&#x3002;&#x7279;&#x522B;&#x662F;&#x5982;&#x679C;&#x540E;&#x671F;&#x5904;&#x7406;&#x5DE5;&#x5177;&#x9700;&#x8981;&#x5BF9;&#x65E5;&#x5FD7;&#x8FDB;&#x884C;&#x5927;&#x5C0F;&#x9650;&#x5236;&#x3002;&#x4E3A;&#x4E86;&#x6EE1;&#x8DB3;&#x8FD9;&#x4E2A;&#x9700;&#x6C42;&#xFF0C;logback &#x914D;&#x5907;&#x4E86; <code>SizeAndTimeBasedRollingPolicy</code>&#x3002;</p>
<p>&#x6CE8;&#x610F;&#xFF0C;<code>TimeBasedRollingPolicy</code> &#x53EF;&#x4EE5;&#x9650;&#x5236;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x603B;&#x7684;&#x5927;&#x5C0F;&#x3002;&#x6240;&#x4EE5;&#x5982;&#x679C;&#x4F60;&#x60F3;&#x8981;&#x8FD9;&#x4E2A;&#x9650;&#x5236;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; <code>totalSizeCap</code> &#x6765;&#x8FBE;&#x5230;&#x8FD9;&#x4E2A;&#x76EE;&#x7684;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x5C55;&#x793A;&#x4E86;&#x57FA;&#x4E8E;&#x65F6;&#x95F4;&#x53CA;&#x5927;&#x5C0F;&#x7684;&#x914D;&#x7F6E;&#xFF1A;</p>
<blockquote>
<p><em>Example: logback-sizeAndTime.xml</em></p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span> <span class="hljs-attr">debug</span>=<span class="hljs-string">&quot;true&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;ROLLING&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>mylog.txt<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">rollingPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy&quot;</span>&gt;</span>
<span class="hljs-comment">&lt;!--             &#x6309;&#x5929;&#x8F6E;&#x8F6C; --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">fileNamePattern</span>&gt;</span>mylog-%d{yyyy-MM-dd}.%i.txt<span class="hljs-tag">&lt;/<span class="hljs-name">fileNamePattern</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">maxFileSize</span>&gt;</span>100MB<span class="hljs-tag">&lt;/<span class="hljs-name">maxFileSize</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">maxHistory</span>&gt;</span>60<span class="hljs-tag">&lt;/<span class="hljs-name">maxHistory</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">totalSizeCap</span>&gt;</span>20GB<span class="hljs-tag">&lt;/<span class="hljs-name">totalSizeCap</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">rollingPolicy</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%msg%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;ROLLING&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x6CE8;&#x610F;&#xFF0C;&#x9664;&#x4E86; %d &#x4E4B;&#x5916;&#x8FD8;&#x6709; %i&#x3002;&#x8FD9;&#x4E24;&#x4E2A;&#x5360;&#x4F4D;&#x7B26;&#x90FD;&#x662F;&#x5F3A;&#x5236;&#x8981;&#x6C42;&#x7684;&#x3002;&#x5728;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#x8FD8;&#x6CA1;&#x6709;&#x5230;&#x8FBE;&#x5468;&#x671F;&#x8F6E;&#x8F6C;&#x4E4B;&#x524D;&#xFF0C;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x8FBE;&#x5230;&#x4E86; <code>maxFileSize</code> &#x6307;&#x5B9A;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x4F1A;&#x8FDB;&#x884C;&#x5F52;&#x6863;&#xFF0C;&#x9012;&#x589E;&#x7D22;&#x5F15;&#x4ECE; 0 &#x5F00;&#x59CB;&#x3002;</p>
<p>&#x57FA;&#x4E8E;&#x5927;&#x5C0F;&#x4E0E;&#x65F6;&#x95F4;&#x7684;&#x6587;&#x4EF6;&#x5F52;&#x6863;&#x652F;&#x6301;&#x5220;&#x9664;&#x65E7;&#x7684;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x3002;&#x4F60;&#x9700;&#x8981;&#x6307;&#x5B9A; <code>maxHistory</code> &#x5C5E;&#x6027;&#x7684;&#x503C;&#x6765;&#x4FDD;&#x5B58;&#x51E0;&#x4E2A;&#x5468;&#x671F;&#x7684;&#x65E5;&#x5FD7;&#x3002;&#x5F53;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x505C;&#x6B62;&#x6216;&#x8005;&#x542F;&#x52A8;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x65E5;&#x5FD7;&#x5C06;&#x4F1A;&#x7EE7;&#x7EED;&#x5411;&#x6B63;&#x786E;&#x7684;&#x4F4D;&#x7F6E;&#x8F93;&#x51FA;&#x3002;&#x5373;&#x5F53;&#x524D;&#x5468;&#x671F;&#x5185;&#x7D22;&#x5F15;&#x6700;&#x5927;&#x7684;&#x3002;</p>
<p>&#x5728; 1.17 &#x7248;&#x672C;&#x524D;&#xFF0C;&#x8FD9;&#x4E2A;&#x6587;&#x6863;&#x4F1A;&#x63D0;&#x53CA;&#x4E00;&#x4E2A;&#x53EB; <code>SizeAndTimeBasedFNATP</code> &#x7684;&#x7EC4;&#x4EF6;&#x3002;&#x4F46;&#x662F; <code>SizeAndTimeBasedFNATP</code> &#x7EC4;&#x4EF6;&#x53EA;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x6700;&#x7B80;&#x5355;&#x7684;&#x914D;&#x7F6E;&#x3002;&#x6211;&#x4EEC;&#x4E0D;&#x518D;&#x63D0;&#x4F9B;&#x5173;&#x4E8E; <code>SizeAndTimeBasedFNATP</code> &#x7684;&#x6587;&#x6863;&#x3002;&#x5C3D;&#x7BA1;&#x8FD9;&#x6837;&#xFF0C;&#x65E9;&#x671F;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4F7F;&#x7528; <code>SizeAndTimeBasedFNATP</code> &#x4F9D;&#x7136;&#x4F1A;&#x8FD0;&#x884C;&#x7684;&#x5F88;&#x597D;&#x3002; &#x5B9E;&#x9645;&#x4E0A;&#xFF0C;<code>SizeAndTimeBasedRollingPolicy</code> &#x662F;&#x4F7F;&#x7528; <code>SizeAndTimeBasedFNATP</code> &#x5B9E;&#x73B0;&#x7684;&#x3002;</p>
<h4 id="fixedwindowrollingpolicy">FixedWindowRollingPolicy</h4>
<p>&#x5728;&#x8F6E;&#x8F6C;&#x65F6;&#xFF0C;<a href="https://logback.qos.ch/xref/ch/qos/logback/core/rolling/FixedWindowRollingPolicy.html" target="_blank"><code>FixedWindowRollingPolicy</code></a> &#x6839;&#x636E;&#x56FA;&#x5B9A;&#x7A97;&#x53E3;&#x7B97;&#x6CD5;&#x91CD;&#x547D;&#x540D;&#x6587;&#x4EF6;&#xFF0C;&#x5177;&#x4F53;&#x63CF;&#x8FF0;&#x5982;&#x4E0B;&#xFF1A;</p>
<p><code>filaNamePattern</code> &#x8868;&#x793A;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x7684;&#x540D;&#x5B57;&#x3002;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x662F;&#x5FC5;&#x987B;&#x7684;&#xFF0C;&#x800C;&#x4E14;&#x5FC5;&#x987B;&#x5305;&#x542B;&#x4E00;&#x4E2A;&#x8868;&#x793A;&#x6574;&#x5F62;&#x7684;&#x5360;&#x4F4D;&#x7B26; <em>i%</em>&#x3002;</p>
<p><code>FixedWindowRollingPolicy</code> &#x7684;&#x53EF;&#x7528;&#x5C5E;&#x6027;&#x5982;&#x4E0B;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x5C5E;&#x6027;&#x540D;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td>minIndex</td>
<td>int</td>
<td>&#x8868;&#x793A;&#x7A97;&#x53E3;&#x7D22;&#x5F15;&#x7684;&#x4E0B;&#x754C;</td>
</tr>
<tr>
<td>maxIndex</td>
<td>int</td>
<td>&#x8868;&#x793A;&#x7A97;&#x53E3;&#x7D22;&#x5F15;&#x7684;&#x4E0A;&#x754C;</td>
</tr>
<tr>
<td>fileNamePattern</td>
<td>String</td>
<td><code>FixedWindowRollingPolicy</code> &#x5728;&#x91CD;&#x547D;&#x540D;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x65F6;&#x5C06;&#x4F1A;&#x6839;&#x636E;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x6765;&#x547D;&#x540D;&#x3002;&#x5B83;&#x5FC5;&#x987B;&#x5305;&#x542B;&#x4E00;&#x4E2A; <em>i%</em> &#x7684;&#x5360;&#x4F4D;&#x7B26;&#xFF0C;&#x8BE5;&#x5360;&#x4F4D;&#x7B26;&#x6307;&#x660E;&#x4E86;&#x7A97;&#x53E3;&#x7D22;&#x5F15;&#x7684;&#x503C;&#x5E94;&#x8BE5;&#x63D2;&#x5165;&#x7684;&#x4F4D;&#x7F6E;&#x3002;<br><br>&#x4F8B;&#x5982;&#xFF0C;&#x5F53;&#x8BE5;&#x5C5E;&#x6027;&#x7684;&#x503C;&#x4E3A; <em>MyLogFile%i.log</em>&#xFF0C;&#x6700;&#x5C0F;&#x4E0E;&#x6700;&#x5927;&#x7684;&#x503C;&#x5206;&#x522B;&#x4E3A; <em>1</em> &#x548C; <em>3</em>&#x3002;&#x5C06;&#x4F1A;&#x4EA7;&#x751F;&#x7684;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x4E3A; <em>MyLogFile1.log</em>&#xFF0C;<em>MyLogFile2.log</em>&#xFF0C;<em>MyLogFile3.log</em>&#x3002;<br><br>&#x6587;&#x4EF6;&#x538B;&#x7F29;&#x7684;&#x65B9;&#x5F0F;&#x4E5F;&#x662F;&#x901A;&#x8FC7;&#x8BE5;&#x5C5E;&#x6027;&#x6765;&#x6307;&#x5B9A;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x8BBE;&#x7F6E;&#x8BE5;&#x5C5E;&#x6027;&#x7684;&#x503C;&#x4E3A; <em>MyLogFile%i.log.zip</em>&#xFF0C;&#x90A3;&#x4E48;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x5C06;&#x4F1A;&#x88AB;&#x538B;&#x7F29;&#x6210; <em>zip</em> &#x683C;&#x5F0F;&#x3002;&#x4E5F;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x538B;&#x7F29;&#x6210; <em>gz</em> &#x683C;&#x5F0F;&#x3002;</td>
</tr>
</tbody>
</table>
<p>&#x7531;&#x4E8E;&#x7A97;&#x53E3;&#x56FA;&#x5B9A;&#x7B97;&#x6CD5;&#x9700;&#x8981;&#x8DDF;&#x7A97;&#x53E3;&#x5927;&#x5C0F;&#x4E00;&#x6837;&#x7684;&#x7684;&#x91CD;&#x547D;&#x540D;&#x6B21;&#x6570;&#xFF0C;&#x56E0;&#x6B64;&#x5F3A;&#x70C8;&#x4E0D;&#x63A8;&#x8350;&#x592A;&#x5927;&#x7684;&#x7A97;&#x53E3;&#x5927;&#x5C0F;&#x3002;&#x5F53;&#x7528;&#x6237;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x8F83;&#x5927;&#x503C;&#x65F6;&#xFF0C;&#x5F53;&#x524D;&#x7684;&#x5B9E;&#x73B0;&#x4F1A;&#x5C06;&#x7A97;&#x53E3;&#x5927;&#x5C0F;&#x81EA;&#x52A8;&#x51CF;&#x5C11;&#x4E3A; 20&#x3002;</p>
<p>&#x8BA9;&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x6765;&#x4E86;&#x89E3;&#x4E0B;&#x56FA;&#x5B9A;&#x7A97;&#x53E3;&#x7B97;&#x6CD5;&#x3002;&#x5047;&#x8BBE; <code>minIndex</code> &#x7684;&#x503C;&#x4E3A; <em>1</em>&#xFF0C;<code>maxIndex</code> &#x7684;&#x503C;&#x4E3A; <em>3</em>&#x3002;<code>fileNamePattern</code> &#x7684;&#x503C;&#x4E3A; <em>foo%i.log</em>&#xFF0C;<code>file</code> &#x5C5E;&#x6027;&#x7684;&#x503C;&#x4E3A; <em>foo.log</em>&#x3002;</p>
<table>
<thead>
<tr>
<th>&#x8F6E;&#x8F6C;&#x6570;&#x76EE;</th>
<th>&#x5F53;&#x524D;&#x8F93;&#x51FA;&#x6587;&#x4EF6;</th>
<th>&#x5F52;&#x6863;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>foo.log</td>
<td>-</td>
<td>&#x8FD8;&#x6CA1;&#x6709;&#x5230;&#x8F6E;&#x8F6C;&#x5468;&#x671F;&#xFF0C;logbak &#x5C06;&#x65E5;&#x5FD7;&#x8F93;&#x51FA;&#x521D;&#x59CB;&#x6587;&#x4EF6;</td>
</tr>
<tr>
<td>1</td>
<td>foo.log</td>
<td>foo1.log</td>
<td>&#x7B2C;&#x4E00;&#x6B21;&#x8F6E;&#x8F6C;&#xFF0C;<em>foo.log</em> &#x88AB;&#x91CD;&#x547D;&#x540D;&#x4E3A; <em>foo1.log</em>&#x3002;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <em>foo.log</em> &#x6587;&#x4EF6;&#x5C06;&#x4F1A;&#x88AB;&#x521B;&#x5EFA;&#x5E76;&#x6210;&#x4E3A;&#x5F53;&#x524D;&#x8F93;&#x51FA;&#x6587;&#x4EF6;</td>
</tr>
<tr>
<td>2</td>
<td>foo.log</td>
<td>foo1.log&#xFF0C;foo2.log</td>
<td>&#x7B2C;&#x4E8C;&#x6B21;&#x8F6E;&#x8F6C;&#xFF0C;<em>foo1.log</em> &#x88AB;&#x91CD;&#x547D;&#x540D;&#x4E3A; <em>foo2.log</em>&#x3002;<em>foo.log</em> &#x88AB;&#x91CD;&#x547D;&#x540D;&#x4E3A; <em>foo1.log</em>&#x3002;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <em>foo.log</em> &#x88AB;&#x521B;&#x5EFA;&#x5E76;&#x6210;&#x4E3A;&#x5F53;&#x524D;&#x8F93;&#x51FA;&#x6587;&#x4EF6;</td>
</tr>
<tr>
<td>3</td>
<td>foo.log</td>
<td>foo1.log&#xFF0C;foo2.log&#xFF0C;foo3.log</td>
<td>&#x7B2C;&#x4E09;&#x6B21;&#x8F6E;&#x8F6C;&#xFF0C;<em>foo2.log</em> &#x88AB;&#x91CD;&#x547D;&#x540D;&#x4E3A; <em>foo3.log</em>&#x3002;<em>foo1.log</em> &#x88AB;&#x547D;&#x540D;&#x4E3A; <em>foo2.log</em>&#x3002;<em>foo.log</em> &#x88AB;&#x91CD;&#x547D;&#x540D;&#x4E3A; <em>foo1.log</em>&#x3002;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <em>foo.log</em> &#x88AB;&#x521B;&#x5EFA;&#x5E76;&#x6210;&#x4E3A;&#x5F53;&#x524D;&#x8F93;&#x51FA;&#x6587;&#x4EF6;</td>
</tr>
<tr>
<td>4</td>
<td>foo.log</td>
<td>foo1.log&#xFF0C;foo2.log&#xFF0C;foo3.log</td>
<td>&#x5728;&#x8FD9;&#x6B21;&#x4EE5;&#x53CA;&#x540E;&#x7EED;&#x7684;&#x8F6E;&#x8F6C;&#x4E2D;&#xFF0C;&#x5C06;&#x4F1A;&#x5220;&#x9664; <em>foo3.log</em> &#x6587;&#x4EF6;&#xFF0C;&#x5176;&#x5B83;&#x6587;&#x4EF6;&#x7684;&#x91CD;&#x547D;&#x540D;&#x64CD;&#x4F5C;&#x8DDF;&#x4E4B;&#x524D;&#x7684;&#x6B65;&#x9AA4;&#x4E00;&#x6837;&#x3002;&#x5728;&#x672C;&#x6B21;&#x4EE5;&#x53CA;&#x4EE5;&#x540E;&#x7684;&#x8F6E;&#x8F6C;&#x4E2D;&#xFF0C;&#x5C06;&#x4F1A;&#x4E00;&#x76F4;&#x53EA;&#x6709;&#x4E09;&#x4E2A;&#x5F52;&#x6863;&#x6587;&#x4EF6;&#x4EE5;&#x53CA;&#x4E00;&#x4E2A;&#x6D3B;&#x8DC3;&#x7684;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;</td>
</tr>
</tbody>
</table>
<p>&#x4E0B;&#x9762;&#x7684;&#x7ED9;&#x51FA;&#x4E86; <code>RollingFileAppender</code> &#x914D;&#x5408; <code>FixedWindowRollingPolicy</code> &#x4F7F;&#x7528;&#x7684;&#x4F8B;&#x5B50;&#x3002;&#x6CE8;&#x610F;&#xFF0C;<code>file</code> &#x5C5E;&#x6027;&#x662F;&#x5F3A;&#x5236;&#x7684;&#xFF0C;&#x5373;&#x4F7F;&#x5B83;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x4E9B;&#x8DDF; <code>fileNamePattern</code> &#x5C5E;&#x6027;&#x76F8;&#x540C;&#x7684;&#x4FE1;&#x606F;&#x3002;</p>
<blockquote>
<p>Example&#xFF1A;logback-RollingFixedWindow.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>test.log<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">rollingPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.FixedWindowRollingPolicy&quot;</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">fileNamePattern</span>&gt;</span>tests.%i.log.zip<span class="hljs-tag">&lt;/<span class="hljs-name">fileNamePattern</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">minIndex</span>&gt;</span>1<span class="hljs-tag">&lt;/<span class="hljs-name">minIndex</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">maxIndex</span>&gt;</span>3<span class="hljs-tag">&lt;/<span class="hljs-name">maxIndex</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">rollingPolicy</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">triggeringPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy&quot;</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">maxFileSize</span>&gt;</span>5MB<span class="hljs-tag">&lt;/<span class="hljs-name">maxFileSize</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">triggeringPolicy</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%-4relative [%thread] %-5level %logger{35} - %msg%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;FILE&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h2 id="&#x89E6;&#x53D1;&#x7B56;&#x7565;&#x7B80;&#x4ECB;">&#x89E6;&#x53D1;&#x7B56;&#x7565;&#x7B80;&#x4ECB;</h2>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/rolling/TriggeringPolicy.html" target="_blank"><code>TriggeringPolicy</code></a> &#x7684;&#x5B9E;&#x73B0;&#x7528;&#x4E8E;&#x901A;&#x77E5; <code>RollingFileAppender</code> &#x4F55;&#x65F6;&#x8F6E;&#x8F6C;&#x3002;</p>
<p><code>TriggeringPolicy</code> &#x63A5;&#x53E3;&#x4EC5;&#x4EC5;&#x53EA;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x3002;</p>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> ch.qos.logback.core.rolling;

<span class="hljs-keyword">import</span> java.io.File;
<span class="hljs-keyword">import</span> ch.qos.logback.core.spi.LifeCycle;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">TriggeringPolicy</span>&lt;<span class="hljs-title">E</span>&gt; <span class="hljs-keyword">extends</span> <span class="hljs-title">LifeCycle</span> </span>{

  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isTriggeringEvent</span><span class="hljs-params">(<span class="hljs-keyword">final</span> File activeFile, <span class="hljs-keyword">final</span> &lt;E&gt; event)</span></span>;
}
</code></pre>
<p><code>isTriggeringEvent()</code> &#x65B9;&#x6CD5;&#x63A5;&#x6536;&#x5F53;&#x524D;&#x6D3B;&#x52A8;&#x7684;&#x6587;&#x4EF6;&#x4EE5;&#x53CA;&#x5F53;&#x524D;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x3002;&#x57FA;&#x4E8E;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#xFF0C;&#x901A;&#x8FC7;&#x5177;&#x4F53;&#x7684;&#x5B9E;&#x73B0;&#x6765;&#x51B3;&#x5B9A;&#x8F6E;&#x8F6C;&#x662F;&#x4E0D;&#x662F;&#x5E94;&#x8BE5;&#x53D1;&#x751F;&#x3002;</p>
<p><code>TimeBasedRollingPolicy</code> &#x662F;&#x4F7F;&#x7528;&#x6700;&#x5E7F;&#x6CDB;&#x7684;&#x89E6;&#x53D1;&#x7B56;&#x7565;&#x3002;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x4F5C;&#x8F6E;&#x8F6C;&#x7B56;&#x7565;&#x6765;&#x4F7F;&#x7528;&#x3002;</p>
<h4 id="sizebasedtriggeringpolicy">SizeBasedTriggeringPolicy</h4>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/rolling/SizeBasedTriggeringPolicy.html" target="_blank"><code>SizeBasedTriggeringPolicy</code></a> &#x89C2;&#x5BDF;&#x5F53;&#x524D;&#x6D3B;&#x52A8;&#x6587;&#x4EF6;&#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x5982;&#x679C;&#x5DF2;&#x7ECF;&#x5927;&#x4E8E;&#x4E86;&#x6307;&#x5B9A;&#x7684;&#x503C;&#xFF0C;&#x5B83;&#x4F1A;&#x7ED9; <code>RollingFileAppender</code> &#x53D1;&#x4E00;&#x4E2A;&#x4FE1;&#x53F7;&#x89E6;&#x53D1;&#x5BF9;&#x5F53;&#x524D;&#x6D3B;&#x52A8;&#x6587;&#x4EF6;&#x7684;&#x8F6E;&#x8F6C;&#x3002;</p>
<p><code>SizeBasedTriggeringPolicy</code> &#x53EA;&#x63A5;&#x6536; <code>maxFileSize</code> &#x8FD9;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x5B83;&#x7684;&#x9ED8;&#x8BA4;&#x503C;&#x662F; 10 MB&#x3002;</p>
<p><code>maxFileSize</code> &#x53EF;&#x4EE5;&#x4E3A;&#x5B57;&#x8282;&#xFF0C;&#x5343;&#x5B57;&#x8282;&#xFF0C;&#x5146;&#x5B57;&#x8282;&#xFF0C;&#x5343;&#x5146;&#x5B57;&#x8282;&#xFF0C;&#x901A;&#x8FC7;&#x5728;&#x6570;&#x503C;&#x540E;&#x9762;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x540E;&#x7F00; <em>KB</em>&#xFF0C;<em>MB</em> &#x6216;&#x8005; <em>GB</em>&#x3002;&#x4F8B;&#x5982;&#xFF0C;<em>5000000</em>&#xFF0C;<em>5000KB</em>&#xFF0C;<em>5MB</em> &#x4EE5;&#x53CA; <em>2GB</em> &#x90FD;&#x662F;&#x6709;&#x6548;&#x7684;&#xFF0C;&#x524D;&#x4E09;&#x4E2A;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.RollingFileAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>test.log<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">rollingPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.FixedWindowRollingPolicy&quot;</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">fileNamePattern</span>&gt;</span>test.%i.log.zip<span class="hljs-tag">&lt;/<span class="hljs-name">fileNamePattern</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">minIndex</span>&gt;</span>1<span class="hljs-tag">&lt;/<span class="hljs-name">minIndex</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">maxIndex</span>&gt;</span>3<span class="hljs-tag">&lt;/<span class="hljs-name">maxIndex</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">rollingPolicy</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">triggeringPolicy</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy&quot;</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">maxFileSize</span>&gt;</span>5MB<span class="hljs-tag">&lt;/<span class="hljs-name">maxFileSize</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">triggeringPolicy</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%-4relative [%thread] %-5level %logger{35} - %msg%n
            <span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;FILE&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h2 id="logback-classic">Logback Classic</h2>
<p>&#x867D;&#x7136;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5728; logback-core &#x662F;&#x901A;&#x7528;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x5728; logback-classic &#x4E2D;&#xFF0C;&#x5B83;&#x4EEC;&#x6C38;&#x8FDC;&#x662F; <code>ILoggingEvent</code> &#x7684;&#x5B9E;&#x4F8B;&#x3002;logback-classic &#x53EA;&#x4E0D;&#x8FC7;&#x662F;&#x7528;&#x6765;&#x5904;&#x7406; <code>ILoggingEvent</code> &#x5B9E;&#x4F8B;&#x7684;&#x4E13;&#x95E8;&#x5904;&#x7406;&#x7BA1;&#x9053;&#x3002;</p>
<h3 id="socketappender-and-sslsocketappender">SocketAppender and SSLSocketAppender</h3>
<p>&#x5230;&#x76EE;&#x524D;&#x4E3A;&#x6B62;&#xFF0C;&#x6240;&#x4ECB;&#x7ECD;&#x7684; appender &#x53EA;&#x80FD;&#x5C06;&#x65E5;&#x5FD7;&#x8F93;&#x51FA;&#x5230;&#x672C;&#x5730;&#x8D44;&#x6E90;&#x3002;&#x76F8;&#x53CD;&#x7684;&#x662F;&#xFF0C;<a href="https://logback.qos.ch/xref/ch/qos/logback/classic/net/SocketAppender.html" target="_blank"><code>SocketAppender</code></a> &#x88AB;&#x8BBE;&#x8BA1;&#x6210;&#x53EF;&#x4EE5;&#x5C06; <code>ILoggingEvent</code> &#x5B9E;&#x4F8B;&#x5E8F;&#x5217;&#x5316;&#x518D;&#x4F20;&#x8F93;&#x5230;&#x8FDC;&#x7AEF;&#x673A;&#x5668;&#x3002;&#x5F53;&#x4F7F;&#x7528; <code>SocketAppender</code> &#x65F6;&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5C06;&#x4EE5;&#x660E;&#x6587;&#x53D1;&#x9001;&#xFF0C;&#x4F7F;&#x7528; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/net/SSLSocketAppender.html" target="_blank"><code>SSLSocketAppender</code></a> &#x65F6;&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5C06;&#x901A;&#x8FC7;&#x5B89;&#x5168;&#x7684;&#x901A;&#x9053;&#x4F20;&#x8F93;&#x3002;</p>
<p>&#x5E8F;&#x5217;&#x5316;&#x4E8B;&#x4EF6;&#x7684;&#x5B9E;&#x9645;&#x7C7B;&#x578B;&#x4E3A; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/spi/LoggingEventVO.html" target="_blank"><code>LoggingEventVO</code></a>&#xFF0C;&#x5B83;&#x5B9E;&#x73B0;&#x4E86; <code>ILoggingEvent</code> &#x63A5;&#x53E3;&#x3002;&#x5C31;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x800C;&#x8A00;&#xFF0C;&#x8FDC;&#x7A0B;&#x65E5;&#x5FD7;&#x662F;&#x975E;&#x4FB5;&#x5165;&#x5F0F;&#x7684;&#x3002;&#x5728;&#x63A5;&#x6536;&#x5230;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5E76;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x4E4B;&#x540E;&#xFF0C;&#x65E5;&#x8BB0;&#x4E8B;&#x4EF6;&#x5C31;&#x50CF;&#x5728;&#x672C;&#x5730;&#x751F;&#x6210;&#x7684;&#x4E00;&#x6837;&#x3002;&#x591A;&#x4E2A; <code>SocketAppender</code> &#x5B9E;&#x4F8B;&#x8FD0;&#x884C;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x673A;&#x5668;&#x4E0A;&#xFF0C;&#x76F4;&#x63A5;&#x5C06;&#x5B83;&#x4EEC;&#x7684;&#x65E5;&#x5FD7;&#x901A;&#x8FC7;&#x56FA;&#x5B9A;&#x7684;&#x683C;&#x5F0F;&#x8F93;&#x51FA;&#x5230;&#x4E2D;&#x592E;&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x3002;<code>SocketAppender</code> &#x4E0D;&#x4F1A;&#x5173;&#x8054; layout&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x662F;&#x5E8F;&#x5217;&#x5316;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5230;&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x3002;<code>SocketAppender</code> &#x5728; <em>Transmission Control Protocol (TCP)</em> &#x5C42;&#x4E0A;&#x8FD0;&#x884C;&#xFF0C;&#x8BE5;&#x5C42;&#x63D0;&#x4F9B;&#x4E86;&#x53EF;&#x9760;&#xFF0C;&#x6709;&#x5E8F;&#xFF0C;&#x6D41;&#x5F0F;&#x63A7;&#x5236;&#x4EE5;&#x53CA;&#x6BB5;&#x5BF9;&#x7AEF;&#x7684;&#x516B;&#x4F4D;&#x5B57;&#x8282;&#x6D41;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x5982;&#x679C;&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668;&#x662F;&#x53EF;&#x4EE5;&#x5230;&#x8FBE;&#x7684;&#xFF0C;&#x90A3;&#x4E48;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x6700;&#x7EC8;&#x90FD;&#x4F1A;&#x5230;&#x8FBE;&#x90A3;&#x91CC;&#x3002;&#x76F8;&#x53CD;&#xFF0C;&#x5982;&#x679C;&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668;&#x6302;&#x6389;&#x6216;&#x8005;&#x4E0D;&#x53EF;&#x8FBE;&#x5230;&#xFF0C;&#x90A3;&#x4E48;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4F1A;&#x88AB;&#x4E22;&#x5F03;&#x3002;&#x5982;&#x679C;&#x670D;&#x52A1;&#x5668;&#x91CD;&#x65B0;&#x6062;&#x590D;&#xFF0C;&#x90A3;&#x4E48;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x4F20;&#x8F93;&#x5C06;&#x4F1A;&#x7EE7;&#x7EED;&#x8FDB;&#x884C;&#x3002;&#x8FD9;&#x79CD;&#x91CD;&#x8FDE;&#x662F;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x8FDE;&#x63A5;&#x7EBF;&#x7A0B;&#x6C60;&#x5468;&#x671F;&#x6027;&#x7684;&#x5C1D;&#x8BD5;&#x8FDE;&#x63A5;&#x6765;&#x8FDB;&#x884C;&#x7684;&#x3002;</p>
<p>&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7531;&#x672C;&#x5730; TCP &#x5B9E;&#x73B0;&#x81EA;&#x52A8;&#x7F13;&#x51B2;&#x3002;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x5982;&#x679C;&#x8FDE;&#x63A5;&#x5230;&#x670D;&#x52A1;&#x5668;&#x7684;&#x901F;&#x5EA6;&#x5F88;&#x6162;&#xFF0C;&#x4F46;&#x662F;&#x6BD4;&#x5BA2;&#x6237;&#x7AEF;&#x4EA7;&#x751F;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x901F;&#x5EA6;&#x8981;&#x5FEB;&#xFF0C;&#x90A3;&#x4E48;&#x5BA2;&#x6237;&#x7AEF;&#x4E0D;&#x4F1A;&#x53D7;&#x5230;&#x7F51;&#x901F;&#x7684;&#x5F71;&#x54CD;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5982;&#x679C;&#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#x901F;&#x5EA6;&#x6BD4;&#x65E5;&#x5FD7;&#x4EA7;&#x751F;&#x901F;&#x5EA6;&#x8981;&#x6162;&#xFF0C;&#x90A3;&#x4E48;&#x5BA2;&#x6237;&#x7AEF;&#x53EA;&#x80FD;&#x4EE5;&#x7F51;&#x7EDC;&#x901F;&#x5EA6;&#x8FDB;&#x884C;&#x5904;&#x7406;&#x3002;&#x7279;&#x522B;&#x5728;&#x6781;&#x7AEF;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FDE;&#x63A5;&#x5230;&#x670D;&#x52A1;&#x5668;&#x7684;&#x7F51;&#x7EDC;&#x6302;&#x6389;&#x4E86;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x6700;&#x7EC8;&#x4F1A;&#x88AB;&#x963B;&#x585E;&#x3002;&#x5982;&#x679C;&#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#x6062;&#x590D;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x670D;&#x52A1;&#x5668;&#x6302;&#x6389;&#x4E86;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x4E0D;&#x4F1A;&#x963B;&#x585E;&#xFF0C;&#x5C3D;&#x7BA1;&#x56E0;&#x4E3A;&#x670D;&#x52A1;&#x5668;&#x6302;&#x6389;&#x4E86;&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4E22;&#x5931;&#x3002;</p>
<p>&#x5C3D;&#x7BA1; <code>SocketAppender</code> &#x4E0D;&#x518D;&#x4F9D;&#x8D56;&#x4EFB;&#x4F55;&#x7684; logger&#xFF0C;&#x5728;&#x5F53;&#x524D;&#x7EBF;&#x7A0B;&#x7684;&#x8FDE;&#x63A5;&#x4E0B;&#x4E5F;&#x4E0D;&#x4F1A;&#x88AB;&#x5783;&#x573E;&#x6536;&#x96C6;&#x3002;&#x4F46;&#x662F;&#x8FDE;&#x63A5;&#x7EBF;&#x7A0B;&#x53EA;&#x6709;&#x5728;&#x670D;&#x52A1;&#x5668;&#x6302;&#x6389;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x624D;&#x5B58;&#x5728;&#xFF0C;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x51FA;&#x73B0;&#x5783;&#x573E;&#x6536;&#x96C6;&#x95EE;&#x9898;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x660E;&#x786E;&#x7684;&#x5173;&#x95ED; <code>SocketAppender</code>&#x3002;&#x751F;&#x547D;&#x5468;&#x671F;&#x957F;&#x7684;&#x5E94;&#x7528;&#x4F1A;&#x521B;&#x5EFA;/&#x9500;&#x6BC1;&#x8BB8;&#x591A; <code>SocketAppender</code> &#x5B9E;&#x4F8B;&#xFF0C;&#x5E94;&#x8BE5;&#x6CE8;&#x610F;&#x5230;&#x8FD9;&#x4E2A;&#x5783;&#x573E;&#x56DE;&#x6536;&#x95EE;&#x9898;&#x3002;&#x5927;&#x90E8;&#x5206;&#x7684;&#x5E94;&#x7528;&#x53EF;&#x4EE5;&#x5FFD;&#x7565;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x3002;&#x5982;&#x679C; JVM &#x5728; <code>SocketAppender</code> &#x5173;&#x95ED;&#x4E4B;&#x524D;&#x9000;&#x51FA;&#xFF0C;&#x65E0;&#x8BBA;&#x662F;&#x663E;&#x5F0F;&#x7684;&#x9000;&#x51FA;&#x6216;&#x8005;&#x662F;&#x901A;&#x8FC7;&#x540E;&#x7EED;&#x7684;&#x5783;&#x573E;&#x56DE;&#x6536;&#xFF0C;&#x90FD;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x672A;&#x4F20;&#x8F93;&#x7684;&#x6570;&#x636E;&#x5728;&#x7BA1;&#x9053;&#x4E2D;&#x88AB;&#x4E22;&#x5931;&#x3002;&#x8FD9;&#x662F;&#x57FA;&#x4E8E; windows &#x7CFB;&#x7EDF;&#x5E38;&#x89C1;&#x7684;&#x95EE;&#x9898;&#x3002;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x6570;&#x636E;&#x4E22;&#x5931;&#xFF0C;&#x901A;&#x5E38;&#x7684;&#x505A;&#x6CD5;&#x662F;&#x8C03;&#x7528; <code>close()</code> &#x65B9;&#x6CD5;&#x53BB;&#x5173;&#x95ED; <code>SocketAppender</code>&#xFF0C;&#x6216;&#x8005;&#x5728;&#x5E94;&#x7528;&#x9000;&#x51FA;&#x4E4B;&#x524D;&#x8C03;&#x7528; <code>LoggerContext</code> &#x7684; <code>stop()</code> &#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668;&#x901A;&#x8FC7; <code>remoteHost</code> &#x4E0E; <code>port</code> &#x5C5E;&#x6027;&#x6765;&#x6807;&#x8BC6;&#x3002;<code>SocketAppender</code> &#x5C5E;&#x6027;&#x7F57;&#x5217;&#x5728;&#x4E0B;&#x8868;&#x5F53;&#x4E2D;&#x3002;<code>SSLSocketAppender</code> &#x652F;&#x6301;&#x989D;&#x5916;&#x7684;&#x4E00;&#x4E9B;&#x5C5E;&#x6027;&#xFF0C;&#x5C06;&#x5728;<a href="https://logback.qos.ch/manual/usingSSL.html" target="_blank">&#x7B2C;&#x5341;&#x4E94;&#x7AE0;</a>&#x8FDB;&#x884C;&#x8BA8;&#x8BBA;&#x3002;</p>
<table>
<thead>
<tr>
<th>&#x5C5E;&#x6027;&#x540D;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td>includeCallerData</td>
<td>boolean</td>
<td>&#x5982;&#x679C;&#x4E3A; true&#xFF0C;&#x90A3;&#x4E48;&#x8C03;&#x7528;&#x8005;&#x7684;&#x4FE1;&#x606F;&#x4E5F;&#x4F1A;&#x88AB;&#x53D1;&#x9001;&#x5230;&#x670D;&#x52A1;&#x7AEF;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; false&#x3002;</td>
</tr>
<tr>
<td>port</td>
<td>int</td>
<td>&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668;&#x7684;&#x7AEF;&#x53E3;&#x53F7;</td>
</tr>
<tr>
<td>reconnectionDelay</td>
<td><a href="https://logback.qos.ch/apidocs/ch/qos/logback/core/util/Duration.html" target="_blank">Duration</a></td>
<td>&#x63A5;&#x53D7;&#x4E00;&#x4E2A;&#x8868;&#x793A;&#x6301;&#x7EED;&#x65F6;&#x95F4;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x4F8B;&#x5982; &quot;10 seconds&quot; &#x4EE3;&#x8868;&#x6BCF;&#x6B21;&#x91CD;&#x8FDE;&#x7684;&#x95F4;&#x9694;&#x65F6;&#x95F4;&#x3002;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; 30 &#x79D2;&#x3002;&#x5C06;&#x8FD9;&#x4E2A;&#x503C;&#x8BBE;&#x7F6E;&#x4E3A; 0&#xFF0C;&#x5C06;&#x4F1A;&#x5173;&#x95ED;&#x91CD;&#x8FDE;&#x673A;&#x5236;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x5982;&#x679C;&#x8FDE;&#x63A5;&#x670D;&#x52A1;&#x5668;&#x6210;&#x529F;&#xFF0C;&#x5219;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0;&#x8FDE;&#x63A5;&#x7EBF;&#x7A0B;&#x6C60;&#x3002;</td>
</tr>
<tr>
<td>queueSize</td>
<td>int</td>
<td>&#x63A5;&#x53D7;&#x4E00;&#x4E2A;&#x6574;&#x6570;&#xFF08;&#x5927;&#x4E8E;0&#xFF09;&#x4EE3;&#x8868;&#x6709;&#x591A;&#x5C11;&#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4F20;&#x8F93;&#x5230;&#x670D;&#x52A1;&#x7AEF;&#x3002;&#x5F53;&#x8FD9;&#x4E2A;&#x503C;&#x4E3A; 1 &#x65F6;&#xFF0C;&#x4F1A;&#x540C;&#x6B65;&#x4F20;&#x8F93;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5230;&#x8FDC;&#x7AEF;&#x3002;&#x5F53;&#x8FD9;&#x4E2A;&#x503C;&#x5927;&#x4E8E; 1 &#x65F6;&#xFF0C;&#x5C06;&#x8BBE;&#x961F;&#x5217;&#x4E2D;&#x8FD8;&#x6709;&#x5269;&#x4F59;&#x7684;&#x7A7A;&#x95F4;&#xFF0C;&#x90A3;&#x4E48;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x4E8B;&#x4EF6;&#x5C06;&#x4F1A;&#x5165;&#x961F;&#x3002;&#x961F;&#x5217;&#x7684;&#x957F;&#x5EA6;&#x5927;&#x4E8E; 1 &#x53EF;&#x4EE5;&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#xFF0C;&#x6D88;&#x9664;&#x7F51;&#x7EDC;&#x5F15;&#x8D77;&#x7684;&#x5EF6;&#x65F6;&#x3002;<br><br>&#x53C2;&#x89C1; <code>eventDelayLimist</code> &#x5C5E;&#x6027;&#x3002;</td>
</tr>
<tr>
<td>eventDelayLimit</td>
<td><a href="https://logback.qos.ch/apidocs/ch/qos/logback/core/util/Duration.html" target="_blank">Duration</a></td>
<td>&#x63A5;&#x53D7;&#x4E00;&#x4E2A;&#x8868;&#x793A;&#x6301;&#x7EED;&#x65F6;&#x95F4;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;&quot;10 seconds&quot;&#x3002;&#x5B83;&#x8868;&#x793A;&#x4E00;&#x65E6;&#x5F53;&#x524D;&#x961F;&#x5217;&#x5DF2;&#x6EE1;&#xFF08;&#x4F8B;&#x5982;&#x5DF2;&#x7ECF;&#x5305;&#x542B;&#x4E86; <code>queueSieze</code> &#x4E2A;&#x4E8B;&#x4EF6;&#xFF09;&#xFF0C;&#x5728;&#x4E22;&#x5F03;&#x4E8B;&#x4EF6;&#x4E4B;&#x524D;&#x7684;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#x3002;&#x5728;&#x8FDC;&#x7AEF;&#x670D;&#x52A1;&#x5668;&#x4E00;&#x76F4;&#x7F13;&#x6162;&#x63A5;&#x6536;&#x4E8B;&#x4EF6;&#x65F6;&#xFF0C;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x5C31;&#x4F1A;&#x53D1;&#x751F;&#x3002;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; 100 &#x6BEB;&#x79D2;&#x3002;</td>
</tr>
<tr>
<td>remoteHost</td>
<td>String</td>
<td>&#x670D;&#x52A1;&#x5668;&#x7684;&#x4E3B;&#x673A;&#x540D;</td>
</tr>
<tr>
<td>ssl</td>
<td>SSLConfiguration</td>
<td>&#x53EA;&#x652F;&#x6301; <code>SSLSocketAppender</code>&#xFF0C;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x63D0;&#x4F9B;&#x4E86; SSL &#x914D;&#x7F6E;&#x4F9B; appender &#x4F7F;&#x7528;&#xFF0C;&#x5C06;&#x5728;<a href="https://logback.qos.ch/manual/usingSSL.html" target="_blank">&#x7B2C;&#x5341;&#x4E94;&#x7AE0;</a>&#x8FDB;&#x884C;&#x8BA8;&#x8BBA;</td>
</tr>
</tbody>
</table>
<h4 id="&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#x7684;&#x9009;&#x62E9;">&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#x7684;&#x9009;&#x62E9;</h4>
<p>logback classic &#x7ED9;&#x670D;&#x52A1;&#x5668;&#x63D0;&#x4F9B;&#x4E86;&#x4E24;&#x4E2A;&#x9009;&#x62E9;&#x63A5;&#x6536;&#x6765;&#x81EA; <code>SocketAppender</code> &#x4E0E; <code>SSLSocketAppender</code> &#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;</p>
<ul>
<li><code>ServerSocketReceiver</code> &#x4E0E;&#x8DDF;&#x5B83;&#x76F8;&#x5BF9;&#x5E94;&#x7684;&#x5177;&#x6709; SSL &#x529F;&#x80FD;&#x7684; <code>SSLServerSocketReceiver</code> &#x90FD;&#x662F;&#x63A5;&#x6536;&#x7EC4;&#x4EF6;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x914D;&#x7F6E;&#x5E94;&#x7528;&#x4E2D;&#x7684; <em>logback.xml</em> &#x6587;&#x4EF6;&#x6765;&#x63A5;&#x6536;&#x8FDC;&#x7A0B; socket appender &#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x67E5;&#x770B;<a href="https://logback.qos.ch/manual/receivers.html" target="_blank">&#x7B2C;&#x5341;&#x56DB;&#x7AE0;</a>&#x83B7;&#x53D6;&#x66F4;&#x591A;&#x7684;&#x4FE1;&#x606F;&#x3002;</li>
<li><code>SimpleSocketServer</code> &#x4E0E;&#x5177;&#x6709; SSL &#x529F;&#x80FD;&#x7684; <code>SimpleSSLSocketServer</code> &#x90FD;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684; java &#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x8BE5;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x88AB;&#x8BBE;&#x8BA1;&#x6210;&#x53EF;&#x914D;&#x7F6E;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x754C;&#x9762;&#x8FD0;&#x884C;&#x3002;&#x8FD9;&#x4E9B;&#x5E94;&#x7528;&#x4EC5;&#x4EC5;&#x7B49;&#x5F85;&#x6765;&#x81EA; <code>SocketAppender</code> &#x6216; <code>SSLSocketAppender</code> &#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#xFF0C;&#x6BCF;&#x4E2A;&#x88AB;&#x63A5;&#x6536;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x6309;&#x7167;&#x672C;&#x5730;&#x670D;&#x52A1;&#x5668;&#x7B56;&#x7565;&#x8FDB;&#x884C;&#x6253;&#x5370;&#x3002;&#x4E0B;&#x9762;&#x7ED9;&#x51FA;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#x3002;</li>
</ul>
<h4 id="&#x4F7F;&#x7528;-simplesocketserver">&#x4F7F;&#x7528; SimpleSocketServer</h4>
<p><code>SimpleSocketServer</code> &#x5E94;&#x7528;&#x63A5;&#x6536;&#x4E24;&#x4E2A;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;&#xFF1A;<em>port</em> &#x4E0E; <em>configFile</em>&#x3002;<em>port</em> &#x76D1;&#x542C;&#x7684;&#x7AEF;&#x53E3;&#xFF0C;<em>configFile</em> &#x8868;&#x793A; XML &#x683C;&#x5F0F;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;</p>
<p>&#x5728; <em>logback-examples/</em> &#x6587;&#x4EF6;&#x5939;&#x4E0B;&#xFF0C;&#x901A;&#x8FC7;&#x4E00;&#x4E0B;&#x547D;&#x4EE4;&#x6765;&#x542F;&#x52A8; <code>SimpleSocketServer</code>&#xFF1A;</p>
<pre><code class="lang-bash">java ch.qos.logback.classic.net.SimpleSocketServer 6000 \
  src/main/java/chapters/appenders/socket/server1.xml
</code></pre>
<p>6000 &#x4E3A;&#x76D1;&#x542C;&#x7684;&#x7AEF;&#x53E3;&#xFF0C;&#x5728; <em>server1.xml</em> &#x4E2D;&#xFF0C;<code>ConsoleAppender</code> &#x4E0E; <code>RollingFileAppender</code> &#x88AB;&#x6DFB;&#x52A0;&#x5230; root logger &#x4E0A;&#x3002;</p>
<p>&#x5728;&#x542F;&#x52A8;&#x4E86; <code>SimpleSocketServer</code> &#x4E4B;&#x540E;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x591A;&#x4E2A;&#x5BA2;&#x6237;&#x7AEF;&#x4E0A;&#x4F7F;&#x7528; <em>SocketAppender</em> &#x6765;&#x53D1;&#x9001;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x8FD9;&#x4E2A;&#x624B;&#x518C;&#x4E2D;&#x76F8;&#x5173;&#x7684;&#x793A;&#x4F8B;&#x5305;&#x542B;&#x4E86;&#x4E24;&#x4E2A;&#x8FD9;&#x6837;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#xFF1A;<em>chapters.appenders.SocketClient1</em> &#x4E0E; <em>chapters.appenders.SocketClient2</em>&#x3002;&#x4E24;&#x4E2A;&#x5BA2;&#x6237;&#x7AEF;&#x90FD;&#x4F1A;&#x7B49;&#x5F85;&#x7528;&#x6237;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x8F93;&#x5165;&#x5B57;&#x7B26;&#x3002;&#x8F93;&#x5165;&#x7684;&#x5B57;&#x7B26;&#x4F1A;&#x88AB;&#x5305;&#x88F9;&#x5728; debug &#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4E2D;&#xFF0C;&#x7136;&#x540E;&#x53D1;&#x9001;&#x5230;&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668;&#x3002;&#x8FD9;&#x4E2A;&#x4E24;&#x4E2A;&#x5BA2;&#x6237;&#x7AEF;&#x4E0D;&#x540C;&#x7684;&#x5730;&#x65B9;&#x5728;&#x4E8E; <code>SocketAppender</code> &#x7684;&#x914D;&#x7F6E;&#x3002;<code>SocketClient1</code> &#x901A;&#x8FC7;&#x7F16;&#x7801;&#x6765;&#x914D;&#x7F6E;&#xFF0C;<code>SocketClient2</code> &#x9700;&#x8981;&#x83B7;&#x53D6;&#x4E00;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;</p>
<p><code>SimpleSocketServer</code> &#x5728;&#x672C;&#x5730;&#x673A;&#x5668;&#x4E0A;&#x542F;&#x52A8;&#x4E4B;&#x540E;&#xFF0C;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x53BB;&#x8FDE;&#x63A5;&#xFF1A;</p>
<pre><code class="lang-bash">java chapters.appenders.socket.SocketClient1 localhost 6000
</code></pre>
<p>&#x4F60;&#x8F93;&#x5165;&#x7684;&#x6BCF;&#x4E00;&#x884C;&#x5B57;&#x7B26;&#x90FD;&#x4F1A;&#x51FA;&#x73B0;&#x5728;&#x4E4B;&#x524D;&#x542F;&#x52A8; <code>SimpleSocketServer</code> &#x7684;&#x63A7;&#x5236;&#x53F0;&#x4E0A;&#x3002;&#x5982;&#x679C;&#x4F60;&#x505C;&#x6B62;&#x6216;&#x8005;&#x91CD;&#x542F; <code>SimpleSocketServer</code>&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x4F1A;&#x91CD;&#x8FDE;&#x65B0;&#x7684;&#x670D;&#x52A1;&#x5B9E;&#x4F8B;&#xFF0C;&#x4F46;&#x662F;&#x5728;&#x65AD;&#x5F00;&#x8FDE;&#x63A5;&#x65F6;&#x7684;&#x65E5;&#x5FD7;&#x65F6;&#x95F4;&#x4F1A;&#x4E22;&#x5931;&#xFF08;&#x4E0D;&#x80FD;&#x53D6;&#x6D88;&#xFF09;&#x3002;</p>
<p>&#x4E0E; <code>SocketClient1</code> &#x4E0D;&#x540C;&#x7684;&#x662F;&#xFF0C;<code>SocketClient2</code> &#x9700;&#x8981;&#x83B7;&#x53D6;&#x4E00;&#x4E2A; XML &#x683C;&#x5F0F;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6765;&#x8FDB;&#x884C;&#x914D;&#x7F6E;&#x3002;&#x914D;&#x7F6E;&#x6587;&#x4EF6; <em>client1.xml</em> &#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF0C;&#x5B83;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A; <code>SocketAppender</code> &#x9644;&#x52A0;&#x5230; root logger &#x4E0A;&#x3002;</p>
<blockquote>
<p>Example: client1.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;SOCKET&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SocketAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">remoteHost</span>&gt;</span>${host}<span class="hljs-tag">&lt;/<span class="hljs-name">remoteHost</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>${port}<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">reconnectionDelay</span>&gt;</span>10000<span class="hljs-tag">&lt;/<span class="hljs-name">reconnectionDelay</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">includeCallerData</span>&gt;</span>${includeCallerData}<span class="hljs-tag">&lt;/<span class="hljs-name">includeCallerData</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;SOCKET&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  

<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x6CE8;&#x610F;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x7684; <code>remoteHost</code>&#xFF0C;<code>port</code>&#xFF0C;<code>includeCallerData</code> &#x5C5E;&#x6027;&#x7684;&#x503C;&#x5E76;&#x6CA1;&#x6709;&#x76F4;&#x63A5;&#x7ED9;&#x51FA;&#xFF0C;&#x800C;&#x662F;&#x901A;&#x8FC7;&#x5360;&#x4F4D;&#x7B26;&#x6765;&#x4EE3;&#x66FF;&#x3002;&#x8FD9;&#x4E9B;&#x503C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7CFB;&#x7EDF;&#x5C5E;&#x6027;&#x6765;&#x6307;&#x5B9A;&#xFF1A;</p>
<pre><code class="lang-bash">java -Dhost=localhost -Dport=6000 -DincludeCallerData=<span class="hljs-literal">false</span> \
  chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/client1.xml
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x5E94;&#x8BE5;&#x4F1A;&#x5F97;&#x5230;&#x8DDF;&#x4E4B;&#x524D; <code>SocketClient1</code> &#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x7C7B;&#x4F3C;&#x7684;&#x7ED3;&#x679C;&#x3002;</p>
<p>&#x8BA9;&#x6211;&#x518D;&#x91CD;&#x590D;&#x5F3A;&#x8C03;&#x4E00;&#x904D;&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x5E8F;&#x5217;&#x5316;&#x6CA1;&#x6709;&#x4FB5;&#x5165;&#x6027;&#x3002;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x51FA;&#x6765;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x50CF;&#x5176;&#x5B83;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4E00;&#x6837;&#x643A;&#x5E26;&#x540C;&#x6837;&#x7684;&#x4FE1;&#x606F;&#x3002;&#x53EF;&#x4EE5;&#x50CF;&#x64CD;&#x4F5C;&#x672C;&#x5730;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4E00;&#x6837;&#x64CD;&#x4F5C;&#x5B83;&#xFF0C;&#x9664;&#x4E86;&#x5E8F;&#x5217;&#x5316;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x9ED8;&#x8BA4;&#x4E0D;&#x4F1A;&#x5305;&#x542B;&#x8C03;&#x7528;&#x8005;&#x7684;&#x4FE1;&#x606F;&#x3002;&#x4E0B;&#x9762;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x6765;&#x8BF4;&#x660E;&#xFF0C;&#x9996;&#x5148;&#x901A;&#x8FC7;&#x4E00;&#x4E0B;&#x547D;&#x4EE4;&#x542F;&#x52A8; <code>SimpleSocketServer</code> &#xFF1A;</p>
<pre><code class="lang-bash"> java ch.qos.logback.classic.net.SimpleSocketServer 6000 \
  src/main/java/chapters/appenders/socket/server2.xml
</code></pre>
<p>&#x914D;&#x7F6E;&#x6587;&#x4EF6; server2.xml &#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x8F93;&#x51FA;&#x8C03;&#x7528;&#x8005;&#x6587;&#x4EF6;&#x540D;&#x4EE5;&#x53CA;&#x884C;&#x53F7;&#x7684; <code>ConsoleAppender</code>&#x3002;&#x5982;&#x679C;&#x4F60;&#x50CF;&#x4E4B;&#x524D;&#x901A;&#x8FC7;&#x914D;&#x7F6E;&#x6587;&#x4EF6; <em>client1.xml</em> &#x6765;&#x8FD0;&#x884C; <code>SocketClient2</code>&#xFF0C;&#x4F60;&#x5C06;&#x4F1A;&#x5728;&#x4E24;&#x4E2A;&#x62EC;&#x53F7;&#x4E4B;&#x95F4;&#x770B;&#x5230;&#x4E24;&#x4E2A;&#x95EE;&#x53F7;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x8C03;&#x7528;&#x8005;&#x7684;&#x6587;&#x4EF6;&#x540D;&#x4EE5;&#x53CA;&#x884C;&#x53F7;&#xFF1A;</p>
<pre><code class="lang-java"><span class="hljs-number">2006</span>-<span class="hljs-number">11</span>-<span class="hljs-number">06</span> <span class="hljs-number">17</span>:<span class="hljs-number">37</span>:<span class="hljs-number">30</span>,<span class="hljs-number">968</span> DEBUG [Thread-<span class="hljs-number">0</span>] [?:?] chapters.appenders.socket.SocketClient2 - Hi
</code></pre>
<p>&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; <code>includeCallerData</code> &#x7684;&#x503C;&#x4E3A; true&#xFF0C;&#x6765;&#x6539;&#x53D8; <code>SocketAppender</code> &#x7684;&#x8F93;&#x51FA;&#x4FE1;&#x606F;&#x3002;&#x4F7F;&#x7528;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p>
<pre><code class="lang-bash">java -Dhost=localhost -Dport=6000 -DincludeCallerData=<span class="hljs-literal">true</span> \
  chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/client1.xml
</code></pre>
<p>&#x56E0;&#x4E3A;&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x51FA;&#x6765;&#x7684;&#x4E8B;&#x4EF6;&#x53EF;&#x4EE5;&#x50CF;&#x672C;&#x5730;&#x65E5;&#x5FD7;&#x65F6;&#x95F4;&#x4E00;&#x6837;&#x88AB;&#x5904;&#x7406;&#xFF0C;&#x6240;&#x4EE5;&#x5B83;&#x4EEC;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x88AB;&#x4F20;&#x9001;&#x5230;&#x7B2C;&#x4E8C;&#x4E2A;&#x670D;&#x52A1;&#x5668;&#x505A;&#x8FDB;&#x4E00;&#x6B65;&#x7684;&#x5904;&#x7406;&#x3002;&#x5728;&#x7EC3;&#x4E60;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E24;&#x53F0;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x7B2C;&#x4E00;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x63A5;&#x53D7;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x8F6C;&#x53D1;&#x5230;&#x7B2C;&#x4E8C;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x3002;</p>
<h4 id="&#x4F7F;&#x7528;-simplesslsocketserver">&#x4F7F;&#x7528; SimpleSSLSocketServer</h4>
<p><code>SimpleSSLSocketServer</code> &#x8DDF;&#x4E4B;&#x524D;&#x4F7F;&#x7528;&#x7684; <code>SimpleSocketServer</code> &#x4E00;&#x6837;&#xFF0C;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x63A5;&#x6536;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#xFF1A;<em>port</em>&#xFF0C;<em>configFile</em>&#x3002;&#x6B64;&#x5916;&#xFF0C;&#x4F60;&#x5FC5;&#x987B;&#x4E3A;&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#x7684; X.509 &#x8BA4;&#x8BC1;&#x901A;&#x8FC7;&#x7CFB;&#x7EDF;&#x5C5E;&#x6027;&#x63D0;&#x4F9B;&#x4F4D;&#x7F6E;&#x4E0E;&#x5BC6;&#x7801;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x5728; <em>logback-examples/</em> &#x6587;&#x4EF6;&#x5939;&#x4E0B;&#xFF0C;&#x901A;&#x8FC7;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#x6765;&#x542F;&#x52A8; <code>SimpleSSLSocketServer</code>&#xFF1A;</p>
<pre><code>java -Djavax.net.ssl.keyStore=src/main/java/chapters/appenders/socket/ssl/keystore.jks \
    -Djavax.net.ssl.keyStorePassword=changeit \
    ch.qos.logback.classic.net.SimpleSSLSocketServer 6000 \
    src/main/java/chapters/appenders/socket/ssl/server.xml
</code></pre><p><code>SimpleSSLSocketServer</code> &#x793A;&#x4F8B;&#x4F7F;&#x7528; X.509 &#x8BA4;&#x8BC1;&#xFF0C;&#x975E;&#x5E38;&#x9002;&#x5408;&#x6D4B;&#x8BD5;&#x4EE5;&#x53CA;&#x5B9E;&#x9A8C;&#x3002;<strong>&#x5728;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x4F7F;&#x7528; <code>SimpleSSLSocketServer</code> &#x4E4B;&#x524D;&#xFF0C;&#x4F60;&#x5E94;&#x8BE5;&#x4E3A;&#x4F60;&#x7684;&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#x83B7;&#x53D6;&#x4E00;&#x4E2A; X.509 &#x8BA4;&#x8BC1;&#x6765;&#x6807;&#x8BC6;&#x4F60;&#x7684;&#x670D;&#x52A1;&#x5668;</strong>&#x3002;&#x8BE6;&#x60C5;&#x8BF7;&#x53C2;&#x8003;<a href="https://logback.qos.ch/manual/usingSSL.html" target="_blank">&#x7B2C;&#x5341;&#x4E94;&#x7AE0;</a>&#x3002;</p>
<p>&#x56E0;&#x4E3A;&#x670D;&#x52A1;&#x5668;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x5728;&#x6839;&#x5143;&#x7D20;&#x4E0A;&#x6307;&#x5B9A;&#x4E86; <code>debug=&quot;true&quot;</code>&#xFF0C;&#x6240;&#x4EE5;&#x4F60;&#x5C06;&#x4F1A;&#x5728;&#x670D;&#x52A1;&#x5668;&#x542F;&#x52A8;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x770B;&#x5230; SSL &#x7684;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#x3002;&#x8FD9;&#x5728;&#x9A8C;&#x8BC1;&#x672C;&#x5730;&#x5B89;&#x5168;&#x7B56;&#x7565;&#x662F;&#x5426;&#x88AB;&#x6B63;&#x786E;&#x5B9E;&#x73B0;&#x65F6;&#x975E;&#x5E38;&#x6709;&#x6548;&#x3002;</p>
<p><code>SimpleSSLSocketServer</code> &#x542F;&#x52A8;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <code>SSLSocketAppender</code> &#x6765;&#x8FDE;&#x63A5;&#x670D;&#x52A1;&#x5668;&#x3002;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x5C55;&#x793A;&#x6240;&#x9700;&#x8981;&#x7684;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#xFF1A;</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span> <span class="hljs-attr">debug</span>=<span class="hljs-string">&quot;true&quot;</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;SOCKET&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SSLSocketAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">remoteHost</span>&gt;</span>${host}<span class="hljs-tag">&lt;/<span class="hljs-name">remoteHost</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>${port}<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">reconnectionDelay</span>&gt;</span>10000<span class="hljs-tag">&lt;/<span class="hljs-name">reconnectionDelay</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">ssl</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">trustStore</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">location</span>&gt;</span>${truststore}<span class="hljs-tag">&lt;/<span class="hljs-name">location</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>${password}<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">trustStore</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">ssl</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;SOCKET&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  

<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x6CE8;&#x610F;&#xFF0C;&#x8DDF;&#x4E4B;&#x524D;&#x4E00;&#x6837;&#xFF0C;<code>remoteHost</code>&#x3001;<code>port</code> &#x7684;&#x503C;&#x901A;&#x8FC7;&#x5360;&#x4F4D;&#x7B26;&#x6765;&#x6307;&#x5B9A;&#x3002;&#x53E6;&#x5916;&#xFF0C;&#x6CE8;&#x610F;&#x4E00;&#x4E0B; <code>ssl</code> &#x5C5E;&#x6027;&#xFF0C;&#x5B83;&#x5305;&#x542B;&#x4E86;&#x4E00;&#x4E2A;&#x5185;&#x7F6E;&#x5C5E;&#x6027; <code>trustStore</code>&#xFF0C;&#x901A;&#x8FC7;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x6765;&#x6307;&#x5B9A;&#x4FE1;&#x7528;&#x5546;&#x5E97;&#x7684;&#x4F4D;&#x7F6E;&#x4EE5;&#x53CA;&#x5BC6;&#x7801;&#x3002;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x975E;&#x5E38;&#x7684;&#x5FC5;&#x8981;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x81EA;&#x7B7E;&#x540D;&#x7684;&#x8BC1;&#x4E66;&#x3002;&#x89C1;<a href="https://logback.qos.ch/manual/usingSSL.html" target="_blank">&#x7B2C;&#x5341;&#x4E94;&#x7AE0;</a>&#x6765;&#x67E5;&#x770B;&#x66F4;&#x591A;&#x4F7F;&#x7528; <code>SSLSocketAppender</code> &#x5173;&#x4E8E; SSL &#x7684;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x6765;&#x8FD0;&#x884C;&#x4E00;&#x4E2A;&#x5BA2;&#x6237;&#x7AEF;&#x5B9E;&#x4F8B;&#xFF0C;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x901A;&#x8FC7;&#x7CFB;&#x7EDF;&#x5C5E;&#x6027;&#x6307;&#x5B9A;&#x5360;&#x4F4D;&#x7B26;&#x7684;&#x503C;&#xFF1A;</p>
<pre><code class="lang-bash">java -Dhost=localhost -Dport=6000 \
    -Dtruststore=file:src/main/java/chapters/appenders/socket/ssl/truststore.jks \
    -Dpassword=changeit \
    chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/ssl/client.xml
</code></pre>
<p>&#x8DDF;&#x4E4B;&#x524D;&#x7684;&#x793A;&#x4F8B;&#x4E00;&#x6837;&#xFF0C;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x63D0;&#x793A;&#x7684;&#x65F6;&#x5019;&#x8F93;&#x5165;&#x4E00;&#x4E9B;&#x4FE1;&#x606F;&#xFF0C;&#x7136;&#x540E;&#x8FD9;&#x4E9B;&#x4FE1;&#x606F;&#x5C06;&#x4F1A;&#x4F20;&#x9001;&#x5230;&#x670D;&#x52A1;&#x7AEF;&#xFF08;&#x4F7F;&#x7528;&#x5B89;&#x5168;&#x7684;&#x901A;&#x9053;&#xFF09;&#xFF0C;&#x5E76;&#x5C55;&#x793A;&#x5728;&#x63A7;&#x5236;&#x53F0;&#x3002;</p>
<p>&#x6CE8;&#x610F;&#xFF0C; <em>truststore</em> &#x7684;&#x503C;&#x662F;&#x901A;&#x8FC7;&#x5728;&#x547D;&#x4EE4;&#x884C;&#x4F7F;&#x7528;&#x7CFB;&#x7EDF;&#x5C5E;&#x6027;&#x6307;&#x5B9A;&#x4E86;&#x4E00;&#x4E2A;&#x6807;&#x8BC6;&#x4FE1;&#x7528;&#x5546;&#x5E97;&#x7684;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#x3002;&#x4F60;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; classpath &#x8DEF;&#x5F84;&#xFF0C;&#x5177;&#x4F53;&#x53C2;&#x8003;<a href="https://logback.qos.ch/manual/usingSSL.html" target="_blank">&#x7B2C;&#x5341;&#x4E94;&#x7AE0;</a>&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8DDF;&#x670D;&#x52A1;&#x5668;&#x542F;&#x52A8;&#x65F6;&#x7C7B;&#x4F3C;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x6839;&#x5143;&#x7D20;&#x4E2D;&#x6DFB;&#x52A0;&#x4E86; <code>debug=&quot;true&quot;</code>&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x542F;&#x52A8;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x8BE6;&#x7EC6;&#x6253;&#x5370;&#x4E86; SSL &#x7684;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#x6765;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x9A8C;&#x8BC1;&#x672C;&#x5730;&#x7B56;&#x7565;&#x7684;&#x4E00;&#x81F4;&#x6027;&#x3002;</p>
<h3 id="serversocketappender-and-sslserversocketappender">ServerSocketAppender and SSLServerSocketAppender</h3>
<p>&#x6211;&#x4EEC;&#x4E4B;&#x524D;&#x8BA8;&#x8BBA;&#x8FC7;&#x7684; <code>SocketAppender</code> &#x7EC4;&#x4EF6;&#xFF08;&#x4EE5;&#x53CA;&#x5177;&#x6709; SSL &#x80FD;&#x529B;&#x7684;&#x526F;&#x672C;&#xFF09;&#x88AB;&#x8BBE;&#x8BA1;&#x6210;&#x5141;&#x8BB8;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x901A;&#x8FC7;&#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#x8FDC;&#x7A0B;&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x4EE5;&#x4FBF;&#x4F20;&#x8F93;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x5728;&#x67D0;&#x4E9B;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x901A;&#x8FC7;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E2A;&#x5BF9;&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#x7684;&#x8FDE;&#x63A5;&#x53EF;&#x80FD;&#x4E0D;&#x65B9;&#x4FBF;&#x6216;&#x8005;&#x4E0D;&#x53EF;&#x884C;&#x3002;&#x5728;&#x8FD9;&#x4E9B;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;logback &#x63D0;&#x4F9B;&#x4E86; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/net/server/ServerSocketAppender" target="_blank"><code>ServerSocketAppender</code></a>&#x3002;</p>
<p><code>ServerSocketAppender</code> &#x4E0D;&#x4F1A;&#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E2A;&#x5230;&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#x7684;&#x8FDE;&#x63A5;&#xFF0C;&#x800C;&#x662F;&#x88AB;&#x52A8;&#x7684;&#x76D1;&#x542C; TCP &#x7AEF;&#x53E3;&#xFF0C;&#x7B49;&#x5F85;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x8FDE;&#x63A5;&#x3002;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x88AB;&#x4F20;&#x8F93;&#x7ED9;&#x8FD9;&#x4E2A; appender&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5206;&#x53D1;&#x7ED9;&#x6BCF;&#x4E2A;&#x8FDE;&#x63A5;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x3002;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x5BA2;&#x6237;&#x7AEF;&#x8FDE;&#x63A5;&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4F1A;&#x88AB;&#x9A6C;&#x4E0A;&#x4E22;&#x5F03;&#x3002;</p>
<p>&#x9664;&#x4E86;&#x57FA;&#x672C;&#x7684; <code>ServerSocketAppender</code> &#x4E4B;&#x5916;&#xFF0C;logback &#x8FD8;&#x63D0;&#x4F9B;&#x4E86; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/net/server/SSLServerSocketAppender" target="_blank"><code>SSLServerSocketAppender</code></a>&#xFF0C;&#x5B83;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x5B89;&#x5168;&#xFF0C;&#x52A0;&#x5BC6;&#x7684;&#x901A;&#x9053;&#x4F20;&#x8F93;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5230;&#x6BCF;&#x4E2A;&#x8FDE;&#x63A5;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x3002;&#x800C;&#x4E14;&#xFF0C;&#x5177;&#x6709; SSL &#x529F;&#x80FD;&#x7684; appender &#x5B8C;&#x5168;&#x652F;&#x6301;&#x57FA;&#x4E8E;&#x8BC1;&#x4E66;&#x7684;&#x53CC;&#x5411;&#x8BA4;&#x8BC1;&#xFF0C;&#x53EA;&#x6709;&#x8BA4;&#x8BC1;&#x901A;&#x8FC7;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x624D;&#x53EF;&#x4EE5;&#x8FDE;&#x63A5;&#x5230;&#x8FD9;&#x4E2A; appender &#x53BB;&#x63A5;&#x6536;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;</p>
<p>&#x5BF9;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x8FDB;&#x884C;&#x7F16;&#x7801;&#x518D;&#x4F20;&#x8F93;&#x7684;&#x65B9;&#x6CD5;&#x4E0E; <code>SocketAppender</code> &#x5B8C;&#x5168;&#x4E00;&#x81F4;&#xFF0C;&#x6BCF;&#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x90FD;&#x662F; <code>ILoggingEvent</code> &#x7684;&#x5B9E;&#x4F8B;&#x3002;&#x53EA;&#x4E0D;&#x8FC7;&#x8FDE;&#x63A5;&#x7684;&#x8D77;&#x59CB;&#x65B9;&#x5411;&#x662F;&#x76F8;&#x53CD;&#x7684;&#x3002;&#x867D;&#x7136; <code>SocketAppender</code> &#x5145;&#x5F53;&#x4E86;&#x4E00;&#x4E2A;&#x4E3B;&#x52A8;&#x7684;&#x89D2;&#x8272;&#x53BB;&#x8FDE;&#x63A5;&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#xFF0C;<code>ServerSocketAppender</code> &#x662F;&#x88AB;&#x52A8;&#x7684;&#x76D1;&#x542C;&#x5373;&#x5C06;&#x5230;&#x6765;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;</p>
<p><code>ServerSocketAppender</code> &#x7684;&#x5B50;&#x7C7B;&#x578B;&#x53EA;&#x63D0;&#x4F9B;&#x7ED9; logback &#x7684;&#x63A5;&#x6536;&#x7EC4;&#x4EF6;&#x3002;&#x5173;&#x4E8E;&#x63A5;&#x6536;&#x7EC4;&#x4EF6;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x8BF7;&#x67E5;&#x770B;<a href="https://logback.qos.ch/manual/receivers.html" target="_blank">&#x7B2C;&#x5341;&#x56DB;&#x7AE0;</a>&#x3002;</p>
<p><code>ServerSocketAppender</code> &#x652F;&#x6301;&#x5982;&#x4E0B;&#x7684;&#x914D;&#x7F6E;&#x5C5E;&#x6027;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x5C5E;&#x6027;&#x540D;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td>address</td>
<td>String</td>
<td>appender &#x76D1;&#x542C;&#x7684;&#x672C;&#x5730;&#x7F51;&#x7EDC;&#x63A5;&#x53E3;&#x5730;&#x5740;&#x3002;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x6307;&#x5B9A;&#xFF0C;&#x5219;&#x76D1;&#x542C;&#x6240;&#x6709;&#x7684;&#x7F51;&#x7EDC;&#x63A5;&#x53E3;</td>
</tr>
<tr>
<td>includeCallerData</td>
<td>boolean</td>
<td>&#x5982;&#x679C;&#x4E3A; true&#xFF0C;&#x8C03;&#x7528;&#x8005;&#x7684;&#x4FE1;&#x606F;&#x5C06;&#x4F1A;&#x53D1;&#x9001;&#x7ED9;&#x8FDC;&#x7A0B;&#x670D;&#x52A1;&#x5668;&#x3002;&#x4E3A; false&#xFF0C;&#x5219;&#x4E0D;&#x53D1;&#x9001;&#x3002;</td>
</tr>
<tr>
<td>port</td>
<td>int</td>
<td>appender &#x76D1;&#x542C;&#x7684;&#x7AEF;&#x53E3;</td>
</tr>
<tr>
<td>ssl</td>
<td>SSLConfiguration</td>
<td>&#x4EC5;&#x4EC5;&#x652F;&#x6301; <code>SSLServerSocketAppender</code>&#x3002;&#x5177;&#x4F53;&#x53C2;&#x89C1;<a href="https://logback.qos.ch/manual/usingSSL.html" target="_blank">&#x7B2C;&#x5341;&#x4E94;&#x7AE0;</a></td>
</tr>
</tbody>
</table>
<p>&#x4EE5;&#x4E0B;&#x662F;&#x5173;&#x4E8E; <code>ServerSocketAppender</code> &#x7684;&#x914D;&#x7F6E;&#xFF1A;</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span> <span class="hljs-attr">debug</span>=<span class="hljs-string">&quot;true&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;SERVER&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.server.ServerSocketAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>${port}<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">includeCallerData</span>&gt;</span>${includeCallerData}<span class="hljs-tag">&lt;/<span class="hljs-name">includeCallerData</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;debug&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;SERVER&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x6CE8;&#x610F;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x8DDF;&#x4E4B;&#x524D; <code>SocketAppender</code> &#x7684;&#x914D;&#x7F6E;&#x53EA;&#x6709; <em>class</em> &#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x4E0D;&#x540C;&#x3002;<code>remoteHost</code> &#x7F3A;&#x5931;&#x8868;&#x793A; appender &#x88AB;&#x52A8;&#x7684;&#x7B49;&#x5F85;&#x8FDC;&#x7A0B;&#x4E3B;&#x673A;&#x7684;&#x8FDE;&#x63A5;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x65B0;&#x5F00;&#x4E00;&#x4E2A;&#x5230;&#x8FDC;&#x7A0B;&#x65E5;&#x5FD7;&#x670D;&#x52A1;&#x5668;&#x7684;&#x8FDE;&#x63A5;&#x3002;</p>
<p>&#x4EE5;&#x4E0B;&#x662F;&#x5173;&#x4E8E; <code>SSLServerSocketAppender</code> &#x7684;&#x914D;&#x7F6E;&#xFF1A;</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span> <span class="hljs-attr">debug</span>=<span class="hljs-string">&quot;true&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;SERVER&quot;</span> 
    <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.server.SSLServerSocketAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>${port}<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">includeCallerData</span>&gt;</span>${includeCallerData}<span class="hljs-tag">&lt;/<span class="hljs-name">includeCallerData</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">ssl</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">keyStore</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">location</span>&gt;</span>${keystore}<span class="hljs-tag">&lt;/<span class="hljs-name">location</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>${password}<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">keyStore</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">ssl</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;debug&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;SERVER&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  

<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x8DDF;&#x4E0A;&#x4E00;&#x4E2A;&#x914D;&#x7F6E;&#x4E3B;&#x8981;&#x7684;&#x4E0D;&#x540C;&#x5728;&#x4E8E; appender &#x7684; <em>class</em> &#x5C5E;&#x6027;&#x4E3A; <code>SSLServerSocketAppender</code> &#x7C7B;&#x578B;&#xFF0C;&#x5305;&#x542B;&#x4E00;&#x4E2A;&#x5D4C;&#x5957;&#x7684; <code>ssl</code> &#x5143;&#x7D20;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x4E3A; appender &#x914D;&#x7F6E;&#x4E86; X.509 &#x8BA4;&#x8BC1;&#x7684; keyStore&#x3002;</p>
<blockquote>
<p>&#x5177;&#x4F53;&#x7684; SSL &#x914D;&#x7F6E;&#x53C2;&#x89C1;&#x7B2C;&#x5341;&#x4E94;&#x7AE0;&#xFF0C;&#x8FD9;&#x53E5;&#x8BDD;&#x7FFB;&#x7684;&#x6211;&#x60F3;&#x5410;&#x4E86;</p>
</blockquote>
<p>&#x56E0;&#x4E3A; <code>ServerSocketAppender</code> &#x7684;&#x5B50;&#x7C7B;&#x662F;&#x4E13;&#x95E8;&#x4E3A;&#x63A5;&#x6536;&#x7EC4;&#x4EF6;&#x8BBE;&#x8BA1;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x5C06;&#x5BF9;&#x8FD9;&#x4E2A;&#x7684;&#x9610;&#x8FF0;&#x63A8;&#x8FDF;&#x5230; <a href="https://logback.qos.ch/manual/receivers.html" target="_blank">&#x7B2C;&#x5341;&#x56DB;&#x7AE0;</a> &#x4ECB;&#x7ECD;&#x3002;</p>
<h3 id="smtpappender">SMTPAppender</h3>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/classic/net/SMTPAppender.html" target="_blank"><code>SMTPAppender</code></a> &#x6536;&#x96C6;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5230;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x56FA;&#x5B9A;&#x5927;&#x5C0F;&#x7684;&#x7F13;&#x51B2;&#x533A;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x6307;&#x5B9A;&#x7684;&#x4E8B;&#x4EF6;&#x53D1;&#x751F;&#x65F6;&#xFF0C;&#x5C06;&#x4ECE;&#x7F13;&#x51B2;&#x533A;&#x4E2D;&#x53D6;&#x51FA;&#x9002;&#x5F53;&#x7684;&#x5185;&#x5BB9;&#x8FDB;&#x884C;&#x53D1;&#x9001;&#x3002;SMTP &#x90AE;&#x4EF6;&#x662F;&#x5F02;&#x6B65;&#x53D1;&#x9001;&#x7684;&#x3002;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5F53;&#x65E5;&#x5FD7;&#x7684;&#x7EA7;&#x522B;&#x4E3A; ERROR &#x65F6;&#xFF0C;&#x90AE;&#x4EF6;&#x53D1;&#x9001;&#x5C06;&#x4F1A;&#x88AB;&#x89E6;&#x53D1;&#x3002;&#x800C;&#x4E14;&#x9ED8;&#x8BA4;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x6240;&#x6709;&#x4E8B;&#x4EF6;&#x90FD;&#x4F7F;&#x7528;&#x540C;&#x4E00;&#x4E2A;&#x7F13;&#x51B2;&#x533A;&#x3002;</p>
<p><code>SMTPAppender</code> &#x7684;&#x5C5E;&#x6027;&#x5982;&#x4E0B;&#x8868;&#x6240;&#x793A;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x5C5E;&#x6027;&#x540D;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td>smtpHost</td>
<td>String</td>
<td>SMTP &#x670D;&#x52A1;&#x5668;&#x7684;&#x4E3B;&#x673A;&#x540D;&#x3002;&#x5F3A;&#x5236;&#x6027;&#x7684;&#x3002;</td>
</tr>
<tr>
<td>smtpPort</td>
<td>int</td>
<td>SMPT &#x670D;&#x52A1;&#x76D1;&#x542C;&#x7684;&#x7AEF;&#x53E3;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; 25.</td>
</tr>
<tr>
<td>to</td>
<td>String</td>
<td>&#x63A5;&#x6536;&#x8005;&#x7684;&#x90AE;&#x4EF6;&#x5730;&#x5740;&#x3002;&#x89E6;&#x53D1;&#x4E8B;&#x4EF6;&#x53D1;&#x9001;&#x7ED9;&#x63A5;&#x6536;&#x8005;&#x3002;&#x591A;&#x4E2A;&#x6536;&#x4EF6;&#x4EBA;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x9017;&#x53F7;(,)&#x5206;&#x9694;&#xFF0C;&#x6216;&#x8005;&#x4F7F;&#x7528;&#x591A;&#x4E2A; <code>&lt;to&gt;</code> &#x5143;&#x7D20;&#x6765;&#x6307;&#x5B9A;&#x3002;</td>
</tr>
<tr>
<td>from</td>
<td>String</td>
<td><code>SMTPAppender</code> &#x4F7F;&#x7528;&#x7684;&#x53D1;&#x4EF6;&#x4EBA;&#xFF0C;&#x683C;&#x5F0F;&#x9075;&#x5FAA;<a href="http://en.wikipedia.org/wiki/Email_address" target="_blank">&#x90AE;&#x4EF6;&#x901A;&#x7528;&#x683C;&#x5F0F;</a>&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x60F3;&#x8981;&#x5305;&#x542B;&#x53D1;&#x9001;&#x8005;&#x7684;&#x540D;&#x5B57;&#xFF0C;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;&#x683C;&#x5F0F; &quot; Adam Smith &lt;smith@moral.org&gt;&quot;&#xFF0C;&#x90A3;&#x4E48;&#x90AE;&#x4EF6;&#x5C06;&#x4F1A;&#x663E;&#x793A;&#x6536;&#x4EF6;&#x4EBA;&#x4E3A; &quot; Adam Smith \<a href="mailto:smith@moral.org\" target="_blank">smith@moral.org\</a>&quot;</td>
</tr>
<tr>
<td>subject</td>
<td>String</td>
<td>&#x90AE;&#x4EF6;&#x7684;&#x4E3B;&#x9898;&#x3002;&#x5B83;&#x53EF;&#x4EE5;&#x662F;&#x901A;&#x8FC7; <a href="https://logback.qos.ch/manual/layouts.html#ClassicPatternLayout" target="_blank">PatternLayout</a> &#x8F6C;&#x6362;&#x540E;&#x7684;&#x6709;&#x6548;&#x503C;&#x3002;&#x5173;&#x4E8E; Layout &#x5C06;&#x5728;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x7AE0;&#x8282;&#x8BA8;&#x8BBA;&#x3002;<br>&#x90AE;&#x4EF6;&#x5E94;&#x8BE5;&#x6709;&#x4E00;&#x4E2A;&#x4E3B;&#x9898;&#x884C;&#xFF0C;&#x5BF9;&#x5E94;&#x89E6;&#x53D1;&#x7684;&#x90AE;&#x4EF6;&#x4FE1;&#x606F;&#x3002;<br>&#x5047;&#x8BBE; <code>subject</code> &#x7684;&#x503C;&#x4E3A;&#xFF1A;&quot;Log: %Logger - %msg&quot;&#xFF0C;&#x89E6;&#x53D1;&#x4E8B;&#x4EF6;&#x7684; logger &#x540D;&#x4E3A; &quot;com.foo.Bar&quot;&#xFF0C;&#x5E76;&#x4E14;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x4E3A; &quot;Hello world&quot;&#x3002;&#x90A3;&#x4E48;&#x53D1;&#x51FA;&#x7684;&#x90AE;&#x4EF6;&#x4FE1;&#x606F;&#x5C06;&#x4F1A;&#x6709;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; &quot;Log: com.foo.Bar - Hello World&quot; &#x7684;&#x4E3B;&#x9898;&#x884C;&#x3002;<br>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x7684;&#x503C;&#x4E3A; &quot;%logger{20} - %m&quot;</td>
</tr>
<tr>
<td>discriminator</td>
<td><a href="https://logback.qos.ch/xref/ch/qos/logback/core/sift/Discriminator.html" target="_blank">Discriminator</a></td>
<td>&#x5728; Discriminator &#x7684;&#x5E2E;&#x52A9;&#x4E0B;&#xFF0C;<code>SMTPAppender</code> &#x6839;&#x636E; discriminator &#x8FD4;&#x56DE;&#x7684;&#x503C;&#x53EF;&#x4EE5;&#x5C06;&#x4E0D;&#x540C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5206;&#x6563;&#x5230;&#x4E0D;&#x540C;&#x7684;&#x7F13;&#x51B2;&#x533A;&#x4E2D;&#x3002;&#x9ED8;&#x8BA4;&#x7684;  discriminator &#x5C06;&#x8FD4;&#x56DE;&#x540C;&#x4E00;&#x4E2A;&#x503C;&#xFF0C;&#x6240;&#x4EE5;&#x6240;&#x6709;&#x7684;&#x4E8B;&#x4EF6;&#x90FD;&#x4F7F;&#x7528;&#x540C;&#x4E00;&#x4E2A;&#x7F13;&#x51B2;&#x533A;&#x3002;</td>
</tr>
<tr>
<td>evaluator</td>
<td><a href="https://logback.qos.ch/xref/ch/qos/logback/classic/boolex/IEvaluator.html" target="_blank">IEvaluator</a></td>
<td>&#x901A;&#x8FC7;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;  <eventevaluator> &#x5143;&#x7D20;&#x6765;&#x58F0;&#x660E;&#x6B64;&#x9009;&#x9879;&#x3002;&#x901A;&#x8FC7; <code>class</code> &#x5C5E;&#x6027;&#x6307;&#x5B9A; class &#x7684;&#x540D;&#x5B57;&#x8868;&#x793A;&#x7528;&#x6237;&#x5E0C;&#x671B;&#x901A;&#x8FC7;&#x54EA;&#x4E2A;&#x7C7B;&#x6765;&#x6EE1;&#x8DB3; <code>SMTPAppender</code> &#x7684; <code>Evaluator</code> &#x7684;&#x9700;&#x8981;&#x3002;<br>&#x5982;&#x679C;&#x6CA1;&#x6709;&#x6307;&#x5B9A;&#x6B64;&#x9009;&#x9879;&#xFF0C;&#x5F53;&#x89E6;&#x53D1;&#x4E00;&#x4E2A;&#x5927;&#x4E8E;&#x7B49;&#x4E8E; <em>ERROR</em> &#x7EA7;&#x522B;&#x7684;&#x4E8B;&#x4EF6;&#x65F6;&#xFF0C;<code>SMTPAppender</code> &#x5C06;&#x4F1A;&#x88AB;&#x5206;&#x914D;&#x4E00;&#x4E2A; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/boolex/OnErrorEvaluator.html" target="_blank">OnErrorEvaluator</a> &#x7684;&#x5B9E;&#x4F8B;&#x3002;<br>logback &#x914D;&#x5907;&#x4E86;&#x51E0;&#x4E2A;&#x5176;&#x5B83;&#x7684;  evaluator&#xFF0C;&#x5206;&#x522B;&#x53EB;  <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/boolex/OnMarkerEvaluator.html" target="_blank"><code>OnMarkerEvaluator</code></a> &#xFF08;&#x5C06;&#x5728;&#x4E0B;&#x9762;&#x8BA8;&#x8BBA;&#xFF09;&#xFF0C;&#x4E00;&#x4E2A;&#x76F8;&#x5BF9;&#x5F3A;&#x5927;&#x7684; evaluator &#x53EB;  <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/boolex/JaninoEventEvaluator.html" target="_blank"><code>JaninoEventEvaluator</code></a>&#xFF08;&#x5728;<a href="https://logback.qos.ch/manual/filters.html#evalutatorFilter" target="_blank">&#x5176;&#x5B83;&#x7AE0;&#x8282;</a>&#x8BA8;&#x8BBA;&#xFF09; &#x4EE5;&#x53CA;&#x6700;&#x8FD1;&#x7248;&#x672C;&#x624D;&#x6709;&#x7684;&#x4E00;&#x4E2A;&#x66F4;&#x52A0;&#x5F3A;&#x5927;&#x7684; evaluator &#x53EB;  <a href="https://logback.qos.ch/manual/filters.html#GEventEvaluator" target="_blank"><code>GEventEvaluator</code></a>&#x3002;</eventevaluator></td>
</tr>
<tr>
<td>cyclicBufferTracker</td>
<td><a href="https://logback.qos.ch/xref/ch/qos/logback/core/spi/CyclicBufferTracker.html" target="_blank"><code>CyclicBufferTracker</code></a></td>
<td>&#x4ECE;&#x540D;&#x5B57;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x662F;&#x4E00;&#x4E2A;  <code>CyclicBufferTracker</code> &#x7684;&#x5B9E;&#x4F8B;&#x8FFD;&#x8E2A;&#x5FAA;&#x73AF;&#x7F13;&#x51B2;&#x533A;&#x3002;&#x5B83;&#x57FA;&#x4E8E; discriminator &#x8FD4;&#x56DE;&#x7684; key &#xFF08;&#x89C1;&#x4E0A;&#xFF09;&#x3002;<br>&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x60F3;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;  cyclicBufferTracker&#xFF0C;&#x90A3;&#x4E48;&#x5C06;&#x4F1A;&#x81EA;&#x52A8;&#x521B;&#x5EFA;&#x4E00;&#x4E2A; <a href="https://logback.qos.ch/xref/ch/qos/logback/core/spi/CyclicBufferTracker.html" target="_blank">CyclicBufferTracker</a> &#x7684;&#x5B9E;&#x4F8B;&#x3002;&#x9ED8;&#x8BA4;&#x7684;&#xFF0C;&#x8FD9;&#x4E2A;&#x5B9E;&#x4F8B;&#x7528;&#x6765;&#x4FDD;&#x7559;&#x4E8B;&#x4EF6;&#x7684;&#x5FAA;&#x73AF;&#x7F13;&#x51B2;&#x533A;&#x7684;&#x5927;&#x5C0F;&#x4E3A; 256&#x3002;&#x4F60;&#x9700;&#x8981;&#x6539;&#x53D8; <code>bufferSize</code> &#x9009;&#x9879;&#x7684;&#x5927;&#x5C0F;&#xFF08;&#x89C1;&#x4E0B;&#x9762;&#xFF09;</td>
</tr>
<tr>
<td>username</td>
<td>String</td>
<td>&#x9ED8;&#x8BA4;&#x4E3A; null</td>
</tr>
<tr>
<td>password</td>
<td>String</td>
<td>&#x9ED8;&#x8BA4;&#x4E3A; null</td>
</tr>
<tr>
<td>STARTTLS</td>
<td>boolean</td>
<td>&#x5982;&#x679C;&#x4E3A; true&#xFF0C;&#x90A3;&#x4E48; appender &#x5C06;&#x4F1A;&#x53D1;&#x9001; STARTTLS &#x547D;&#x4EE4;&#xFF08;&#x5982;&#x679C;&#x670D;&#x52A1;&#x5668;&#x652F;&#x6301;&#xFF09;&#x5C06;&#x8FDE;&#x63A5;&#x53D8;&#x6210; SSL &#x8FDE;&#x63A5;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x8FDE;&#x63A5;&#x521D;&#x59CB;&#x7684;&#x65F6;&#x5019;&#x662F;&#x4E3A;&#x52A0;&#x5BC6;&#x7684;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; false&#x3002;</td>
</tr>
<tr>
<td>SSL</td>
<td>boolean</td>
<td>&#x5982;&#x679C;&#x4E3A; true&#xFF0C;&#x5C06;&#x901A;&#x8FC7; SSL &#x8FDE;&#x63A5;&#x670D;&#x52A1;&#x5668;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; false&#x3002;</td>
</tr>
<tr>
<td>charsetEncoding</td>
<td>String</td>
<td>&#x90AE;&#x4EF6;&#x4FE1;&#x606F;&#x5C06;&#x4F1A;&#x901A;&#x8FC7; <a href="(https:/docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html">charset</a>]<a href="https://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html" target="_blank">https://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html</a>) &#x8FDB;&#x884C;&#x7F16;&#x7801;&#x3002;&#x9ED8;&#x8BA4;&#x7F16;&#x7801;&#x4E3A; &quot;UTF-8&quot;</td>
</tr>
<tr>
<td>localhost</td>
<td>String</td>
<td>&#x4E00;&#x65E6;  SMTP &#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x4E3B;&#x673A;&#x540D;&#x6CA1;&#x6709;&#x914D;&#x7F6E;&#x6B63;&#x786E;&#xFF0C;&#x4F8B;&#x5982;&#x5BA2;&#x6237;&#x7AEF;&#x7684; hostname &#x4E0D;&#x662F;&#x5168;&#x9650;&#x5B9A;&#x7684;&#xFF0C;&#x90A3;&#x4E48;&#x670D;&#x52A1;&#x7AEF;&#x4F1A;&#x62D2;&#x7EDD;&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x9001;&#x7684; HELO/EHLO &#x547D;&#x4EE4;&#x3002;&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5C06; <code>localhost</code> &#x7684;&#x503C;&#x8BBE;&#x7F6E;&#x4E3A;&#x5BA2;&#x6237;&#x7AEF;&#x4E3B;&#x673A;&#x7684;&#x5168;&#x9650;&#x5B9A;&#x540D;&#x3002;&#x8BE6;&#x60C5;&#x89C1;  <a href="http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/package-summary.html" target="_blank">com.sun.mail.smtp</a> &#x5305;&#x6587;&#x6863;&#x4E2D;&#x7684; &quot;mail.smtp.localhost&quot; &#x5C5E;&#x6027;&#x3002;(&#x8FD9;&#x4E2A;&#x7F51;&#x7AD9;&#x5DF2;&#x7ECF;&#x5173;&#x95ED;&#x4E86;...)</td>
</tr>
<tr>
<td>asynchronousSending</td>
<td>boolean</td>
<td>&#x51B3;&#x5B9A;&#x90AE;&#x4EF6;&#x4F20;&#x8F93;&#x662F;&#x5426;&#x662F;&#x5F02;&#x6B65;&#x8FDB;&#x884C;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; &apos;true&apos;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5728;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5F02;&#x6B65;&#x53D1;&#x9001;&#x4E0D;&#x600E;&#x4E48;&#x5408;&#x9002;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5F53;&#x53D1;&#x751F;&#x4E00;&#x4E2A;&#x4E25;&#x91CD;&#x9519;&#x8BEF;&#x65F6;&#xFF0C;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x4F7F;&#x7528; <code>SMTPAppender</code> &#x53BB;&#x53D1;&#x9001;&#x4E00;&#x4E2A;&#x8B66;&#x544A;&#xFF0C;&#x7136;&#x540E;&#x9000;&#x51FA;&#x3002;&#x4F46;&#x662F;&#x76F8;&#x5173;&#x7EBF;&#x7A0B;&#x53EF;&#x80FD;&#x6CA1;&#x6709;&#x65F6;&#x95F4;&#x53BB;&#x53D1;&#x9001;&#x8B66;&#x544A;&#x90AE;&#x4EF6;&#x3002;&#x5728;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x8BE5;&#x5C5E;&#x6027;&#x7684;&#x503C;&#x4E3A; &apos;false&apos;&#x3002;</td>
</tr>
<tr>
<td>includeCallerData</td>
<td>boolean</td>
<td>&#x9ED8;&#x8BA4;&#x4E3A; false&#x3002;&#x5982;&#x679C; <code>asynchronousSending</code> &#x7684;&#x503C;&#x4E3A; true&#xFF0C;&#x5E76;&#x4E14;&#x4F60;&#x5E0C;&#x671B;&#x5728;&#x65E5;&#x5FD7;&#x4E2D;&#x770B;&#x5230;&#x8C03;&#x7528;&#x8005;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x8BE5;&#x5C5E;&#x6027;&#x7684;&#x503C;&#x4E3A; true</td>
</tr>
<tr>
<td>sessionViaJNDI</td>
<td>boolean</td>
<td><code>SMTPAppender</code> &#x57FA;&#x4E8E; <code>javax.mail.Session</code> &#x6765;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#x4FE1;&#x606F;&#x3002;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8BE5;&#x5C5E;&#x6027;&#x7684;&#x503C;&#x4E3A; false&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x7528;&#x6237;&#x6307;&#x5B9A;&#x76F8;&#x5173;&#x5C5E;&#x6027;&#x901A;&#x8FC7; <code>SMTPAppender</code> &#x6765;&#x6784;&#x5EFA; <code>javax.mail.Session</code> &#x5B9E;&#x4F8B;&#x3002;&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A; true&#xFF0C;<code>javax.mail.Session</code> &#x5B9E;&#x4F8B;&#x5C06;&#x4F1A;&#x901A;&#x8FC7; JNDI &#x6765;&#x83B7;&#x53D6;&#x3002;&#x53C2;&#x89C1; <code>jndiLocation</code> &#x5C5E;&#x6027;&#x3002;<br>&#x901A;&#x8FC7; JNDI &#x83B7;&#x53D6; <code>Session</code> &#x5B9E;&#x4F8B;&#x53EF;&#x4EE5;&#x51CF;&#x5C11;&#x9700;&#x8981;&#x914D;&#x7F6E;&#x7684;&#x6570;&#x91CF;&#xFF0C;&#x4F7F;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x51CF;&#x5C11;&#x91CD;&#x590D;(<a href="http://en.wikipedia.org/wiki/Don&apos;t_repeat_yourself" target="_blank">dryer</a>)&#x7684;&#x5DE5;&#x4F5C;&#x3002;&#x66F4;&#x591A;&#x5173;&#x4E8E;&#x5728; Tomcat &#x914D;&#x7F6E; JNDI &#x7684;&#x4FE1;&#x606F;&#x8BF7;&#x53C2;&#x8003;  <a href="http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JavaMail_Sessions" target="_blank">JNDI Resources How-to</a>&#x3002;<br><code>&#x6CE8;&#x610F;</code>&#xFF1A;&#x901A;&#x8FC7; JNDI &#x83B7;&#x53D6; <code>Session</code> &#x7684;&#x65F6;&#x5019;&#x8BF7;&#x79FB;&#x9664; web &#x5E94;&#x7528;&#x4E0B;  <em>WEB-INF/lib</em> &#x6587;&#x4EF6;&#x5939;&#x4E0B;&#x7684; <em>mail.jar</em> &#x4E0E; <em>activation.jar</em>&#x3002;</td>
</tr>
<tr>
<td>jndiLocation</td>
<td>String</td>
<td>JNDI &#x4E2D;&#x653E;&#x7F6E;  javax.mail.Session &#x7684;&#x5730;&#x65B9;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A;&#xFF1A;&quot; java:comp/env/mail/Session &quot;</td>
</tr>
</tbody>
</table>
<p>SMTPAppender &#x4EC5;&#x4EC5;&#x53EA;&#x5728;&#x5B83;&#x7684;&#x5FAA;&#x73AF;&#x7F13;&#x5B58;&#x533A;&#x4E2D;&#x4FDD;&#x7559;&#x6700;&#x540E; 256 &#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#xFF0C;&#x5F53;&#x7F13;&#x5B58;&#x533A;&#x5FEB;&#x8981;&#x6EE1;&#x7684;&#x65F6;&#x5019;&#x4E22;&#x6389;&#x65E7;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x901A;&#x8FC7; SMTPAppender &#x53D1;&#x9001;&#x4EFB;&#x4F55;&#x90AE;&#x4EF6;&#x5305;&#x542B;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x90FD;&#x4E0D;&#x4F1A;&#x8D85;&#x8FC7; 256 &#x4E2A;&#x3002;&#x8FD9;&#x5728;&#x4FDD;&#x7559;&#x5185;&#x5B58;&#x9700;&#x6C42;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x8FD8;&#x63D0;&#x4F9B;&#x4E86;&#x6570;&#x91CF;&#x53EF;&#x89C2;&#x7684;&#x5E94;&#x7528;&#x4E0A;&#x4E0B;&#x6587;&#x3002;</p>
<p><code>SMTPAppender</code> &#x57FA;&#x4E8E; JavaMail API&#x3002;&#x5728; JavaMail 1.4 &#x7248;&#x672C;&#x505A;&#x8FC7;&#x6D4B;&#x8BD5;&#x3002;JavaMail &#x9700;&#x8981; JavaBeans Activation Framework &#x5305;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x53BB;&#x5B83;&#x4EEC;&#x5404;&#x81EA;&#x7684;&#x7F51;&#x7AD9;&#x4E0B;&#x8F7D; <a href="http://java.sun.com/products/javamail/" target="_blank">JavaMail API</a> &#x4E0E; <a href="http://java.sun.com/beans/glasgow/jaf.html" target="_blank">JavaBeans Activation Framework</a>&#x3002;&#x5728;&#x8FD0;&#x884C;&#x4E0B;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x4E4B;&#x524D;&#x5148;&#x786E;&#x4FDD;&#x5C06;&#x8FD9;&#x4E24;&#x4E2A; jar &#x5305;&#x653E;&#x5728; classpath &#x4E0B;&#x3002;</p>
<p><a href="https://logback.qos.ch/xref/chapters/appenders/mail/EMail.html" target="_blank"><code>chapters.appenders.mail.EMail</code></a> &#x5E94;&#x7528;&#x4F1A;&#x751F;&#x6210;&#x591A;&#x4E2A;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#xFF0C;&#x968F;&#x540E;&#x518D;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x9519;&#x8BEF;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x3002;&#x5B83;&#x63A5;&#x6536;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x7B2C;&#x4E00;&#x53C2;&#x6570;&#x662F;&#x6574;&#x5F62;&#xFF0C;&#x8868;&#x793A;&#x9700;&#x8981;&#x751F;&#x6210;&#x591A;&#x5C11;&#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x8868;&#x793A; logback &#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;<em>Email</em> &#x6700;&#x540E;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x9519;&#x8BEF;&#x65E5;&#x5FD7;&#xFF0C;&#x5C06;&#x4F1A;&#x89E6;&#x53D1;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x662F;&#x4E00;&#x4E2A; <code>Email</code> &#x5E94;&#x7528;&#x7684;&#x7B80;&#x5355;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#xFF1A;</p>
<blockquote>
<p>Example: mail1 </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>SMTP &#x670D;&#x52A1;&#x5668;&#x7684;&#x5730;&#x5740;<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>&#x6536;&#x4EF6;&#x4EBA;1<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>&#x6536;&#x4EF6;&#x4EBA;2<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>&#x53D1;&#x4EF6;&#x4EBA;<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">subject</span>&gt;</span>TESTING: %logger{20} - %m<span class="hljs-tag">&lt;/<span class="hljs-name">subject</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.PatternLayout&quot;</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%date %-5level %logger{35} - %message%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">layout</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x5728;&#x4F7F;&#x7528;&#x4EE5;&#x4E0A;&#x914D;&#x7F6E;&#x6D4B;&#x8BD5; <code>chapters.appenders.mail.Email</code> &#x4E4B;&#x524D;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x8BBE;&#x7F6E; <code>smtpHost</code>&#xFF0C;<code>to</code>&#xFF0C;<code>from</code> &#x7684;&#x503C;&#x3002;&#x4E00;&#x65E6;&#x4F60;&#x6B63;&#x786E;&#x8BBE;&#x7F6E;&#x4E86;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x503C;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x4E00;&#x4E0B;&#x547D;&#x4EE4;&#x6765;&#x6267;&#x884C;&#xFF1A;</p>
<pre><code class="lang-bash">java chapters.appenders.mail.EMail 100 src/main/java/chapters/appenders/mail/mail1.xml
</code></pre>
<p>&#x6536;&#x4EF6;&#x8005;&#x6536;&#x5230;&#x7684;&#x90AE;&#x4EF6;&#x662F;&#x7ECF;&#x8FC7; <code>PatternLayout</code> &#x683C;&#x5F0F;&#x5316;&#x540E;&#x7684; 100 &#x6761;&#x65E5;&#x5FD7;&#x3002;&#x4E0B;&#x56FE;&#x5C55;&#x793A;&#x7684;&#x5C31;&#x662F; Mozilla Thunderbird &#x90AE;&#x4EF6;&#x5BA2;&#x6237;&#x7AEF;&#x63A5;&#x6536;&#x5230;&#x7684;&#x90AE;&#x4EF6;&#x3002;</p>
<p><img src="images/smtpAppender1.jpg" alt="smtpAppender1"></p>
<p>&#x4E0B;&#x4E2A;&#x4F8B;&#x5B50;&#x914D;&#x7F6E;&#x6587;&#x4EF6; <em>mail2.xml</em> &#x4E2D;&#x7684; <code>smtpHost</code>&#xFF0C;<code>to</code>&#xFF0C;<code>from</code> &#x5C5E;&#x6027;&#x7684;&#x503C;&#x901A;&#x8FC7;&#x5360;&#x4F4D;&#x7B26;&#x6765;&#x4EE3;&#x66FF;&#x3002;&#x4E0B;&#x9762;&#x662F; <code>mail2.xml</code> &#x914D;&#x7F6E;&#x4E2D;&#x7684;&#x4E00;&#x90E8;&#x5206;&#xFF1A;</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>${smtpHost}<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>${to}<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>${from}<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.html.HTMLLayout&quot;</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>
</code></pre>
<p>&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x547D;&#x4EE4;&#x884C;&#x6765;&#x4F20;&#x9012;&#x53C2;&#x6570;&#xFF1A;</p>
<pre><code class="lang-bash">java -Dfrom=<span class="hljs-built_in">source</span>@xyz.com -Dto=recipient@xyz.com -DsmtpHost=some_smtp_host \
  chapters.appenders.mail.EMail 10000 src/main/java/chapters/appenders/mail/mail2.xml
</code></pre>
<p>&#x6839;&#x636E;&#x4F60;&#x7684;&#x73AF;&#x5883;&#x66FF;&#x6362;&#x5408;&#x9002;&#x7684;&#x503C;&#x3002;</p>
<p>&#x6CE8;&#x610F;&#x5728;&#x65B0;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;<code>PatternLayout</code> &#x88AB; <code>HTMLLayout</code> &#x66FF;&#x4EE3;&#xFF0C;&#x5C06;&#x65E5;&#x5FD7;&#x683C;&#x5F0F;&#x5316;&#x4E3A; HTML &#x8868;&#x683C;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x66F4;&#x6539;&#x884C;&#x4E0E;&#x5217;&#x7684;&#x987A;&#x5E8F;&#xFF0C;&#x4EE5;&#x53CA;&#x8868;&#x683C;&#x7684; CSS &#x6837;&#x5F0F;&#x3002;&#x67E5;&#x770B; <a href="https://logback.qos.ch/manual/layouts.html#ClassicHTMLLayout" target="_blank">HTMLLayout</a> &#x6587;&#x6863;&#x66F4;&#x8BE6;&#x7EC6;&#x7684;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x7ED9;&#x5B9A;&#x7684;&#x5FAA;&#x73AF;&#x7F13;&#x51B2;&#x533A;&#x7684;&#x5927;&#x5C0F;&#x4E3A; 256&#xFF0C;&#x6536;&#x4EF6;&#x4EBA;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x7ECF;&#x8FC7; 256 &#x6761;&#x7ECF;&#x8FC7;&#x683C;&#x5F0F;&#x5316;&#x7684;&#x65E5;&#x5FD7;&#x663E;&#x793A;&#x5728; HTML &#x8868;&#x683C;&#x4E2D;&#x3002;&#x6CE8;&#x610F;&#xFF0C;<code>chapters.appenders.mail.Email</code> &#x5E94;&#x7528;&#x751F;&#x6210;&#x4E86; 10&apos;000 &#x6761;&#x65E5;&#x5FD7;&#xFF0C;&#x4F46;&#x662F;&#x53EA;&#x6709;&#x6700;&#x65B0;&#x7684; 256 &#x6761;&#x65E5;&#x5FD7;&#x4F1A;&#x663E;&#x793A;&#x5728;&#x90AE;&#x4EF6;&#x4E2D;&#x3002;</p>
<p><img src="images/smtpAppender2.jpg" alt="smtpAppender2"></p>
<p>&#x50CF; Mozilla Thunderbird, Eudora or MS Outlook &#x8FD9;&#x4E9B;&#x90AE;&#x4EF6;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x975E;&#x5E38;&#x597D;&#x7684; CSS &#x6837;&#x5F0F;&#x6765;&#x652F;&#x6301; HTML &#x90AE;&#x4EF6;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x6709;&#x65F6;&#x5019;&#x4F1A;&#x81EA;&#x52A8;&#x5C06; HTML &#x683C;&#x5F0F;&#x53D8;&#x6210;&#x6587;&#x672C;&#x683C;&#x5F0F;&#x3002;&#x5982;&#x679C;&#x60F3;&#x5728; Thunderbird &#x67E5;&#x770B; HTML &#x683C;&#x5F0F;&#x7684;&#x90AE;&#x4EF6;&#xFF0C;&#x9700;&#x8981;&#x901A;&#x8FC7; &quot;View&#x2192;Message Body As&#x2192;Original HTML&quot; &#x9009;&#x9879;&#x6765;&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;&#x3002;Yahoo &#x90AE;&#x7BB1;&#x5BF9; HTML &#x90AE;&#x4EF6;&#x6709;&#x975E;&#x5E38;&#x597D;&#x7684; CSS &#x6837;&#x5F0F;&#x652F;&#x6301;&#x3002;&#x53E6;&#x4E00;&#x65B9;&#x9762;&#x5BF9; Gmail &#x6765;&#x8BF4;&#xFF0C;&#x867D;&#x7136;&#x5B83;&#x652F;&#x6301;&#x57FA;&#x672C; HTML &#x8868;&#x7ED3;&#x6784;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x4F1A;&#x5FFD;&#x7565;&#x5185;&#x90E8;&#x7684; CSS &#x6837;&#x5F0F;&#x3002;Gmail &#x652F;&#x6301;&#x5185;&#x8054;&#x7684; CSS &#x6837;&#x5F0F;&#xFF0C;&#x4F46;&#x662F;&#x7531;&#x4E8E;&#x5185;&#x8054;&#x7684; CSS &#x4F1A;&#x4F7F;&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#x53D8;&#x5F97;&#x5E9E;&#x5927;&#xFF0C;&#x6240;&#x4EE5; <code>HTMLLayout</code> &#x4E0D;&#x4F1A;&#x4F7F;&#x7528;&#x5185;&#x8054;&#x7684; CSS &#x6837;&#x5F0F;&#x3002;</p>
<h3 id="&#x5B9A;&#x5236;&#x7F13;&#x51B2;&#x533A;&#x5927;&#x5C0F;">&#x5B9A;&#x5236;&#x7F13;&#x51B2;&#x533A;&#x5927;&#x5C0F;</h3>
<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;<code>SMTPAppender</code> &#x4F1A;&#x8F93;&#x51FA;&#x6700;&#x65B0;&#x7684; 256 &#x6761;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x3002;&#x4E0B;&#x9762;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x8BBE;&#x7F6E;&#x4E86;&#x4E0D;&#x540C;&#x7F13;&#x51B2;&#x533A;&#x5927;&#x5C0F;&#x3002;</p>
<blockquote>
<p>Example: customBufferSize.xml</p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>${smtpHost}<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>${to}<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>${from}<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">subject</span>&gt;</span>%logger{20} - %m<span class="hljs-tag">&lt;/<span class="hljs-name">subject</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.html.HTMLLayout&quot;</span> /&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">cyclicBufferTracker</span>
            <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.spi.CyclicBufferTracker&quot;</span>&gt;</span>
            <span class="hljs-comment">&lt;!-- &#x6BCF;&#x5C01;&#x90AE;&#x4EF6;&#x53EA;&#x5305;&#x542B;&#x4E00;&#x6761;&#x65E5;&#x5FD7; --&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">bufferSize</span>&gt;</span>1<span class="hljs-tag">&lt;/<span class="hljs-name">bufferSize</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">cyclicBufferTracker</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h3 id="&#x89E6;&#x53D1;&#x4E8B;&#x4EF6;">&#x89E6;&#x53D1;&#x4E8B;&#x4EF6;</h3>
<p>&#x5982;&#x679C; <strong>evaluator</strong> &#x5C5E;&#x6027;&#x6CA1;&#x6709;&#x8BBE;&#x7F6E;&#xFF0C;&#x5F53;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x7EA7;&#x522B;&#x4E3A; ERROR &#x65F6;&#xFF0C;<code>SMTPAppender</code> &#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/boolex/OnErrorEvaluator.html" target="_blank">OnErrorEvaluator</a> &#x5B9E;&#x4F8B;&#x6765;&#x89E6;&#x53D1;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#x3002;&#x53D1;&#x9001;&#x9519;&#x8BEF;&#x65F6;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#x662F;&#x6BD4;&#x8F83;&#x5408;&#x7406;&#x7684;&#xFF0C;<code>EventEvaluator</code> &#x63D0;&#x4F9B;&#x4E86;&#x4E0D;&#x540C;&#x7684;&#x5B9E;&#x73B0;&#x6765;&#x91CD;&#x5199;&#x9ED8;&#x8BA4;&#x7684;&#x65B9;&#x6CD5;&#x3002;</p>
<p><code>SMTPAppender</code> &#x63D0;&#x4EA4;&#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x901A;&#x8FC7; evaluator &#x90FD;&#x4F1A;&#x8C03;&#x7528; <code>evaluate()</code> &#x65B9;&#x6CD5;&#x6765;&#x51B3;&#x5B9A;&#x8FD9;&#x4E2A;&#x4E8B;&#x4EF6;&#x662F;&#x5426;&#x9700;&#x8981;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#xFF0C;&#x6216;&#x8005;&#x4EC5;&#x4EC5;&#x662F;&#x66FF;&#x6362;&#x7F13;&#x51B2;&#x533A;&#x4E2D;&#x7684;&#x5185;&#x5BB9;&#x3002;&#x5F53; evaluator &#x7ED9;&#x4E86;&#x4E00;&#x4E2A;&#x786E;&#x5B9A;&#x7684;&#x7B54;&#x6848;&#xFF0C;&#x90A3;&#x4E48;&#x5C06;&#x4F1A;&#x53D1;&#x9001;&#x90AE;&#x4EF6;&#x3002;<code>SMTPAppender</code> &#x6709;&#x4E14;&#x53EA;&#x6709;&#x4E00;&#x4E2A; evaluator &#x5B9E;&#x4F8B;&#x3002;&#x8FD9;&#x4E2A;&#x5B9E;&#x4F8B;&#x80FD;&#x591F;&#x7BA1;&#x7406;&#x5B83;&#x81EA;&#x5DF1;&#x7684;&#x5185;&#x90E8;&#x72B6;&#x6001;&#x3002;&#x4E3A;&#x4E86;&#x5BF9;&#x8FD9;&#x4E2A;&#x8FDB;&#x884C;&#x8BF4;&#x660E;&#xFF0C;<code>CounterBasedEvaluator</code> &#x5B9E;&#x73B0;&#x4E86;&#x4E00;&#x4E2A; evaluator&#xFF0C;&#x5F53;&#x7B2C; 1024 &#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5230;&#x6765;&#x65F6;&#x624D;&#x4F1A;&#x89E6;&#x53D1;&#x90AE;&#x4EF6;&#x53D1;&#x9001;&#x3002;</p>
<blockquote>
<p>Example: <a href="https://logback.qos.ch/xref/chapters/appenders/mail/CounterBasedEvaluator.html" target="_blank">CounterBasedEvaluator.java</a></p>
</blockquote>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> chapters.appenders.mail;

<span class="hljs-keyword">import</span> ch.qos.logback.core.boolex.EvaluationException;
<span class="hljs-keyword">import</span> ch.qos.logback.core.boolex.EventEvaluator;
<span class="hljs-keyword">import</span> ch.qos.logback.core.spi.ContextAwareBase;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CounterBasedEvaluator</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ContextAwareBase</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">EventEvaluator</span> </span>{

  <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> LIMIT = <span class="hljs-number">1024</span>;
  <span class="hljs-keyword">int</span> counter = <span class="hljs-number">0</span>;
  String name;

  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">evaluate</span><span class="hljs-params">(Object event)</span> <span class="hljs-keyword">throws</span> NullPointerException,
      EvaluationException </span>{
    counter++;

    <span class="hljs-keyword">if</span> (counter == LIMIT) {
      counter = <span class="hljs-number">0</span>;

      <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
    }
  }

  <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> name;
  }

  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span><span class="hljs-params">(String name)</span> </span>{
    <span class="hljs-keyword">this</span>.name = name;
  }
}
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x7C7B;&#x7EE7;&#x627F;&#x4E86; <code>ContextAwareBase</code> &#x4EE5;&#x53CA;&#x5B9E;&#x73B0;&#x4E86; <code>EventEvaluator</code> &#x63A5;&#x53E3;&#x3002;&#x8FD9;&#x53EF;&#x4EE5;&#x8BA9;&#x7528;&#x6237;&#x4E13;&#x6CE8;&#x5728; <code>EventEvaluator</code> &#x7684;&#x6838;&#x5FC3;&#x529F;&#x80FD;&#x4E0A;&#xFF0C;&#x8BA9;&#x57FA;&#x7C7B;&#x63D0;&#x4F9B;&#x57FA;&#x7840;&#x7684;&#x529F;&#x80FD;&#x3002;</p>
<p>&#x8BBE;&#x7F6E; <code>SMTPAppender</code> &#x7684; <code>evaluator</code> &#x9009;&#x9879;&#x6765;&#x6307;&#x5B9A;&#x7528;&#x6237;&#x81EA;&#x5B9A;&#x4E49;&#x7684; evaluator&#x3002;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5C06; <code>SMTPAppender</code> &#x9644;&#x52A0;&#x5728; root logger &#x4E0A;&#xFF0C;&#x5E76;&#x4F7F;&#x7528; <code>CounterBasedEvaluator</code> &#x4F5C;&#x4E3A;&#x5B83;&#x4E8B;&#x4EF6;&#x7684; evaluator&#x3002;</p>
<blockquote>
<p>Example: mail3.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">evaluator</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;chapters.appenders.mail.CounterBasedEvaluator&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>${smtpHost}<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>${to}<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>${from}<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">subject</span>&gt;</span>%logger{20} - %m<span class="hljs-tag">&lt;/<span class="hljs-name">subject</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.html.HTMLLayout&quot;</span>/&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h3 id="&#x57FA;&#x4E8E;&#x6807;&#x8BB0;marker&#x89E6;&#x53D1;">&#x57FA;&#x4E8E;&#x6807;&#x8BB0;(Marker)&#x89E6;&#x53D1;</h3>
<p>&#x867D;&#x7136;&#x901A;&#x8FC7;&#x9ED8;&#x8BA4;&#x901A;&#x8FC7;&#x9519;&#x8BEF;&#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;&#x6765;&#x89E6;&#x53D1;&#x90AE;&#x4EF6;&#x7684;&#x53D1;&#x9001;&#x662F;&#x5408;&#x7406;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x53EF;&#x80FD;&#x4F1A;&#x5BFC;&#x81F4;&#x592A;&#x591A;&#x7684;&#x90AE;&#x4EF6;&#x5145;&#x65A5;&#x7528;&#x6237;&#x7684;&#x90AE;&#x7BB1;&#x3002;logback &#x81EA;&#x5E26;&#x4E86;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x89E6;&#x53D1;&#x7B56;&#x7565;&#xFF0C;&#x53EB;&#x505A; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/boolex/OnMarkerEvaluator.html" target="_blank">OnMarkerEvaluator</a>&#x3002;&#x5B83;&#x57FA;&#x4E8E;&#x6807;&#x8BB0;&#x6765;&#x89E6;&#x53D1;&#x3002;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x901A;&#x8FC7;&#x7528;&#x6237;&#x6307;&#x5B9A;&#x7684;&#x6807;&#x8BB0;&#x6765;&#x89E6;&#x53D1;&#x3002;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x8BF4;&#x660E;&#x8FD9;&#x4E2A;&#x4E00;&#x70B9;&#xFF1A;</p>
<p><a href="https://logback.qos.ch/xref/chapters/appenders/mail/Marked_EMail.html" target="_blank">Marked_EMail</a> &#x5E94;&#x7528;&#x5305;&#x542B;&#x4E86;&#x51E0;&#x4E2A;&#x65E5;&#x5FD7;&#x8BED;&#x53E5;&#xFF0C;&#x90FD;&#x662F; ERROR &#x7EA7;&#x522B;&#x7684;&#x3002;&#x4F46;&#x662F;&#x53EA;&#x6709;&#x5176;&#x4E2D;&#x7684;&#x4E00;&#x6761;&#x88AB;&#x6807;&#x8BB0;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x662F;&#x76F8;&#x5173;&#x7684;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="lang-java">Marker notifyAdmin = MarkerFactory.getMarker(<span class="hljs-string">&quot;NOTIFY_ADMIN&quot;</span>);
logger.error(notifyAdmin,
  <span class="hljs-string">&quot;This is a serious an error requiring the admin&apos;s attention&quot;</span>,
   <span class="hljs-keyword">new</span> Exception(<span class="hljs-string">&quot;Just testing&quot;</span>));
</code></pre>
<p>&#x4E0B;&#x9762;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x8868;&#x793A;&#x5F53;&#x5B58;&#x5728;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x88AB;&#x6807;&#x8BB0;&#x4E3A; NOTIFY_ADMIN &#x6216;&#x8005; TRANSACTION_FAILURE &#x5C06;&#x4F1A;&#x89E6;&#x53D1;&#x90AE;&#x4EF6;&#x53D1;&#x9001;&#x3002;</p>
<blockquote>
<p>Example: mailWithMarker.xml</p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">evaluator</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.boolex.OnMarkerEvaluator&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">marker</span>&gt;</span>NOTIFY_ADMIN<span class="hljs-tag">&lt;/<span class="hljs-name">marker</span>&gt;</span>
      <span class="hljs-comment">&lt;!-- &#x4F60;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x591A;&#x4E2A;&#x6807;&#x8BB0; --&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">marker</span>&gt;</span>TRANSACTION_FAILURE<span class="hljs-tag">&lt;/<span class="hljs-name">marker</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">evaluator</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>${smtpHost}<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>${to}<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>${from}<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.html.HTMLLayout&quot;</span>/&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">level</span> <span class="hljs-attr">value</span> =<span class="hljs-string">&quot;debug&quot;</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x6267;&#x884C;&#xFF1A;</p>
<pre><code class="lang-bash">java -Dfrom=<span class="hljs-built_in">source</span>@xyz.com -Dto=recipient@xyz.com -DsmtpHost=some_smtp_host \
  chapters.appenders.mail.Marked_EMail src/main/java/chapters/appenders/mail/mailWithMarker.xml
</code></pre>
<h4 id="&#x57FA;&#x4E8E;&#x6807;&#x8BB0;&#x89E6;&#x53D1;&#x7684;-janinoeventevaluator">&#x57FA;&#x4E8E;&#x6807;&#x8BB0;&#x89E6;&#x53D1;&#x7684; JaninoEventEvaluator</h4>
<p>&#x9664;&#x4E86;&#x4F7F;&#x7528;&#x6838;&#x5FC3;&#x7684; <code>OnMarkerEvaluator</code>&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x662F;&#x4F7F;&#x7528;&#x66F4;&#x52A0;&#x901A;&#x7528;&#x7684; <a href="https://logback.qos.ch/manual/filters.html#JaninoEventEvaluator" target="_blank"><code>JaninoEventEvaluator</code></a>&#xFF0C;&#x751A;&#x81F3;&#x66F4;&#x52A0;&#x5F3A;&#x5927;&#x7684; <a href="https://logback.qos.ch/manual/filters.html#GEventEvaluator" target="_blank"><code>GEventEvaluator</code></a>&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x4E0B;&#x9762;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4F7F;&#x7528; <code>JaninoEventEvaluator</code> &#x800C;&#x4E0D;&#x662F; <code>OnMarkerEvaluator</code>&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x4EEC;&#x7684;&#x542B;&#x4E49;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;</p>
<blockquote>
<p>Example: mailWithMarker_Janino.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">evaluator</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.boolex.JaninoEventEvaluator&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">expression</span>&gt;</span>
        (marker != null) &amp;&amp;
        (marker.contains(&quot;NOTIFY_ADMIN&quot;) || marker.contains(&quot;TRANSACTION_FAILURE&quot;))
      <span class="hljs-tag">&lt;/<span class="hljs-name">expression</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">evaluator</span>&gt;</span>    
    ... &#x8DDF;&#x4E4B;&#x524D;&#x4E00;&#x6837;
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h4 id="&#x57FA;&#x4E8E;&#x6807;&#x8BB0;&#x89E6;&#x53D1;&#x7684;-geventevaluator">&#x57FA;&#x4E8E;&#x6807;&#x8BB0;&#x89E6;&#x53D1;&#x7684; GEventEvaluator</h4>
<p>&#x901A;&#x8FC7;&#x4F7F;&#x7528; <a href="https://logback.qos.ch/manual/filters.html#GEventEvaluator" target="_blank">GEventEvaluator</a> &#x6765;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x76F8;&#x540C;&#x7684; evaluator&#x3002;</p>
<blockquote>
<p>Example: mailWithMarker_GEvent.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">evaluator</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.boolex.GEventEvaluator&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">expression</span>&gt;</span>
        e.marker?.contains(&quot;NOTIFY_ADMIN&quot;) || e.marker?.contains(&quot;TRANSACTION_FAILURE&quot;)
      <span class="hljs-tag">&lt;/<span class="hljs-name">expression</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">evaluator</span>&gt;</span>    
    ... &#x8DDF;&#x4E4B;&#x524D;&#x4E00;&#x6837;
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x56E0;&#x4E3A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x53EF;&#x80FD;&#x6CA1;&#x6709; marker&#xFF0C;&#x6240;&#x4EE5; marke &#x7684;&#x503C;&#x53EF;&#x80FD;&#x4E3A; null&#x3002;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; Groovy &#x7684;&#x5B89;&#x5168;&#x89E3;&#x5F15;&#x7528;&#x64CD;&#x4F5C;&#x7B26;&#xFF0C;&#x4E5F;&#x5C31;&#x662F; . ? &#x64CD;&#x4F5C;&#x7B26;&#x3002;</p>
<h3 id="starttlsssl-&#x8BA4;&#x8BC1;">STARTTLS/SSL &#x8BA4;&#x8BC1;</h3>
<p><code>SMTPAppender</code> &#x652F;&#x6301;&#x901A;&#x8FC7;&#x7528;&#x6237;&#x540D;/&#x5BC6;&#x7801;&#x4EE5;&#x53CA; STARTTLS&#xFF0C;SSL &#x534F;&#x8BAE;&#x8FDB;&#x884C;&#x8BA4;&#x8BC1;&#x3002;STARTTLS  &#x8DDF; SSL &#x7684;&#x4E0D;&#x540C;&#x4E4B;&#x5904;&#x5728;&#x4E8E;&#xFF0C;STARTTLS &#x521D;&#x59CB;&#x5316;&#x8FDE;&#x63A5;&#x4E0D;&#x662F;&#x52A0;&#x5BC6;&#x7684;&#xFF0C;&#x4EC5;&#x4EC5;&#x53EA;&#x6709;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x51FA; STARTTLS &#x547D;&#x4EE4;&#x7684;&#x65F6;&#x5019;&#x5C06;&#x8FDE;&#x63A5;&#x53D8;&#x4E3A; SSL&#x3002;&#x5728; SSL &#x6A21;&#x5F0F;&#x4E0B;&#xFF0C;&#x8FDE;&#x63A5;&#x5728;&#x4E00;&#x5F00;&#x59CB;&#x5C31;&#x662F;&#x88AB;&#x52A0;&#x5BC6;&#x7684;&#x3002;</p>
<h3 id="gmail-&#x7684;-smtpappender-&#x914D;&#x7F6E;-ssl">Gmail &#x7684; SMTPAppender &#x914D;&#x7F6E; (SSL)</h3>
<p>&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x662F; Gmail SSL &#x534F;&#x8BAE;&#x7684; <code>SMTPAppender</code> &#x914D;&#x7F6E;&#xFF1A;</p>
<blockquote>
<p>Example: gmailSSL.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>smtp.gmail.com<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">smtpPort</span>&gt;</span>465<span class="hljs-tag">&lt;/<span class="hljs-name">smtpPort</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">SSL</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">SSL</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">username</span>&gt;</span>YOUR_USERNAME@gmail.com<span class="hljs-tag">&lt;/<span class="hljs-name">username</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>YOUR_GMAIL_PASSWORD<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>EMAIL-DESTINATION<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>ANOTHER_EMAIL_DESTINATION<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span> <span class="hljs-comment">&lt;!-- additional destinations are possible --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>YOUR_USERNAME@gmail.com<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">subject</span>&gt;</span>TESTING: %logger{20} - %m<span class="hljs-tag">&lt;/<span class="hljs-name">subject</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.PatternLayout&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%date %-5level %logger{35} - %message%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">layout</span>&gt;</span>       
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<blockquote>
<p>&#x8BD1;&#x8005;&#x6CE8;&#xFF1A;Gmail &#x7684;&#x914D;&#x7F6E;&#x6211;&#x6CA1;&#x6709;&#x6D4B;&#x8BD5;&#x6210;&#x529F;&#xFF0C;&#x4E00;&#x76F4;&#x53D1;&#x9001;&#x4E0D;&#x4E86;&#x90AE;&#x4EF6;&#x3002;&#x6700;&#x540E;&#x8FD8;&#x662F;&#x914D;&#x7F6E;&#x7684; 163 &#x90AE;&#x7BB1;</p>
</blockquote>
<h3 id="gmail-&#x7684;-smtpappender-&#x914D;&#x7F6E;-starttls">Gmail &#x7684; SMTPAppender &#x914D;&#x7F6E; (STARTTLS)</h3>
<p>&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x662F; Gmail STARTTLS &#x534F;&#x8BAE;&#x7684; <code>SMTPAppender</code> &#x914D;&#x7F6E;&#xFF1A;</p>
<blockquote>
<p>Example: gmailSTARTTLS.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>   
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>smtp.gmail.com<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">smtpPort</span>&gt;</span>587<span class="hljs-tag">&lt;/<span class="hljs-name">smtpPort</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">STARTTLS</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">STARTTLS</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">username</span>&gt;</span>YOUR_USERNAME@gmail.com<span class="hljs-tag">&lt;/<span class="hljs-name">username</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>YOUR_GMAIL_xPASSWORD<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>EMAIL-DESTINATION<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>ANOTHER_EMAIL_DESTINATION<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span> <span class="hljs-comment">&lt;!-- additional destinations are possible --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>YOUR_USERNAME@gmail.com<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">subject</span>&gt;</span>TESTING: %logger{20} - %m<span class="hljs-tag">&lt;/<span class="hljs-name">subject</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.PatternLayout&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%date %-5level %logger - %message%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">layout</span>&gt;</span>       
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h3 id="smtpappender-&#x4E0E;-mdcdiscriminator">SMTPAppender &#x4E0E; MDCDiscriminator</h3>
<p>&#x4E4B;&#x524D;&#x63D0;&#x5230;&#x8FC7;&#xFF0C;&#x6307;&#x5B9A;&#x4E00;&#x4E2A; discriminator &#x800C;&#x4E0D;&#x662F;&#x4F7F;&#x7528;&#x9ED8;&#x8BA4;&#x7684;&#x3002;&#x6839;&#x636E;&#x6307;&#x5B9A;&#x7684; discriminator&#xFF0C;<code>SMTPAppender</code> &#x4F1A;&#x751F;&#x6210;&#x5173;&#x4E8E;&#x7279;&#x5B9A;&#x7528;&#x6237;&#xFF0C;&#x7528;&#x6237; session&#xFF0C;&#x5BA2;&#x6237;&#x7AEF; IP &#x5730;&#x5740;&#x7684;&#x90AE;&#x4EF6;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x662F; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/sift/MDCBasedDiscriminator.html" target="_blank">MDCBasedDiscriminator</a> &#x4E0E;&#x4E00;&#x4E2A;&#x540D;&#x53EB; req.remoteHost &#x7684; MDC key &#x7ED3;&#x5408;&#x4F7F;&#x7528;&#x7684;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x3002;&#x5047;&#x5B9A;&#x8BE5; key &#x5DF2;&#x7ECF;&#x5305;&#x542B;&#x4E86;&#x8FDC;&#x7A0B;&#x4E3B;&#x673A;&#x7684; IP &#x5730;&#x5740;&#x3002;&#x5728; web &#x5E94;&#x7528;&#x4E2D;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; <a href="https://logback.qos.ch/manual/mdc.html#mis" target="_blank">MDCInsertingServletFilter</a> &#x53BB;&#x586B;&#x5145; MDC &#x7684;&#x503C;&#x3002;</p>
<blockquote>
<p>Example: mailWithMDCBasedDiscriminator.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>   
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SMTPAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>ADDRESS-OF-YOUR-SMTP-HOST<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>EMAIL-DESTINATION<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>SENDER-EMAIL<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">discriminator</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.sift.MDCBasedDiscriminator&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">key</span>&gt;</span>req.remoteHost<span class="hljs-tag">&lt;/<span class="hljs-name">key</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">defaultValue</span>&gt;</span>default<span class="hljs-tag">&lt;/<span class="hljs-name">defaultValue</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">discriminator</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">subject</span>&gt;</span>${HOSTNAME} -- %X{req.remoteHost} %msg&quot;<span class="hljs-tag">&lt;/<span class="hljs-name">subject</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.html.HTMLLayout&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%date%level%thread%X{req.remoteHost}%X{req.requestURL}%logger%msg<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">layout</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">level</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;EMAIL&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x6240;&#x4EE5;&#xFF0C;<code>SMTPAppender</code> &#x53D1;&#x9001;&#x7684;&#x6BCF;&#x4E00;&#x5C01;&#x90AE;&#x4EF6;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x72EC;&#x7279;&#x7684;&#x8FDC;&#x7A0B;&#x4E3B;&#x673A;&#xFF0C;&#x8FD9;&#x975E;&#x5E38;&#x5229;&#x4E8E;&#x5B9A;&#x4F4D;&#x95EE;&#x9898;&#x3002;</p>
<h4 id="&#x5728;&#x7E41;&#x5FD9;&#x7684;&#x5E94;&#x7528;&#x4E2D;&#x8FDB;&#x884C;&#x7F13;&#x51B2;&#x533A;&#x7BA1;&#x7406;">&#x5728;&#x7E41;&#x5FD9;&#x7684;&#x5E94;&#x7528;&#x4E2D;&#x8FDB;&#x884C;&#x7F13;&#x51B2;&#x533A;&#x7BA1;&#x7406;</h4>
<p>&#x5728;&#x5185;&#x90E8;&#xFF0C;discriminator &#x8FD4;&#x56DE;&#x6BCF;&#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x503C;&#x90FD;&#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5FAA;&#x73AF;&#x7F13;&#x51B2;&#x533A;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x4F1A;&#x7EF4;&#x62A4;&#x4E00;&#x4E2A; <code>maxNumberOfBuffers</code> &#x53D8;&#x91CF; (&#x9ED8;&#x8BA4;&#x4E3A; 64)&#x3002;&#x5F53;&#x7F13;&#x51B2;&#x533A;&#x7684;&#x6570;&#x91CF;&#x8D85;&#x8FC7; <code>maxNumberOfBuffers</code> &#x65F6;&#xFF0C;&#x6700;&#x8FD1;&#x6700;&#x5C11;&#x66F4;&#x65B0;&#x7684;&#x7F13;&#x51B2;&#x533A;&#x4F1A;&#x88AB;&#x4E22;&#x5F03;&#x3002;&#x7B2C;&#x4E8C;&#x4E2A;&#x5B89;&#x5168;&#x7B56;&#x7565;&#x662F;&#xFF0C;&#x6700;&#x8FD1; 30 &#x5206;&#x949F;&#x6CA1;&#x6709;&#x88AB;&#x66F4;&#x65B0;&#x7684;&#x7F13;&#x51B2;&#x533A;&#x4F1A;&#x88AB;&#x4E22;&#x5F03;&#x3002;</p>
<p>&#x5728;&#x6BCF;&#x5206;&#x949F;&#x6709;&#x5927;&#x91CF;&#x4E8B;&#x52A1;&#x7684;&#x673A;&#x5668;&#x4E0A;&#xFF0C;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x8F83;&#x5C0F;&#x503C;&#x7684; <code>maxNumberOfBuffers</code>&#xFF0C;&#x5C06;&#x4F1A;&#x5BFC;&#x81F4;&#x90AE;&#x4EF6;&#x4E2D;&#x7684;&#x65E5;&#x5FD7;&#x6570;&#x91CF;&#x53D8;&#x5F97;&#x7279;&#x522B;&#x5C0F;&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#xFF0C;&#x5728;&#x5B58;&#x5728;&#x5927;&#x91CF;&#x4E8B;&#x52A1;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8FDE;&#x7EED;&#x751F;&#x6210;&#x540C;&#x4E00;&#x4E2A; discriminator &#x503C;&#x4F1A;&#x5BFC;&#x81F4;&#x591A;&#x4E2A;&#x7F13;&#x51B2;&#x533A;&#x4F1A;&#x4E0E;&#x540C;&#x4E00;&#x4E2A;&#x4E8B;&#x52A1;&#x76F8;&#x5173;&#x8054;&#xFF0C;&#x56E0;&#x4E3A;&#x7F13;&#x51B2;&#x533A;&#x4F1A;&#x88AB; kill &#x6389;&#x518D;&#x91CD;&#x5EFA;&#x3002;&#x5373;&#x4F7F;&#x5728;&#x7E41;&#x5FD9;&#x7684;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF0C;&#x5FAA;&#x73AF;&#x7F13;&#x51B2;&#x533A;&#x7684;&#x6700;&#x5927;&#x6570;&#x91CF;&#x4E5F;&#x4F1A;&#x88AB; <code>maxNumberOfBuffers</code> &#x6240;&#x9650;&#x5236;&#x3002;</p>
<p>&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x8FD9;&#x79CD;&#x60A0;&#x60A0;&#x7403;&#x6548;&#x5E94;(&#x6447;&#x6446;&#x4E0D;&#x5B9A;)&#xFF0C;&#x5F53;&#x65E5;&#x5FD7;&#x65F6;&#x95F4;&#x88AB;&#x6807;&#x8BB0;&#x4E3A; &quot;FINALIZE_SESSION &quot; &#x65F6;&#xFF0C; <code>SMTPAppender</code> &#x4F1A;&#x91CA;&#x653E;&#x4E0E;&#x7ED9;&#x5B9A; discriminator &#x503C;&#x76F8;&#x5173;&#x8054;&#x7684;&#x7F13;&#x51B2;&#x533A;&#x3002;&#x8FD9;&#x5C06;&#x4F1A;&#x5BFC;&#x81F4;&#x5728;&#x6BCF;&#x4E2A;&#x4E8B;&#x52A1;&#x5FEB;&#x8981;&#x7ED3;&#x675F;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5C06;&#x4F1A;&#x4E22;&#x5F03;&#x9002;&#x5F53;&#x7684;&#x7F13;&#x51B2;&#x533A;&#x3002;&#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x907F;&#x514D; OOM &#x7684;&#x524D;&#x63D0;&#x4E0B;&#xFF0C;&#x589E;&#x52A0; <code>maxNumberOfBuffers</code> &#x7684;&#x503C;&#x5230; 512 &#x6216; 1024&#x3002;</p>
<p>&#x8FD9;&#x91CC;&#x6709;&#x4E09;&#x4E2A;&#x5B8C;&#x5168;&#x4E0D;&#x540C;&#x4F46;&#x662F;&#x53C8;&#x4E92;&#x8865;&#x7684;&#x673A;&#x5236;&#x4E00;&#x8D77;&#x7BA1;&#x7406;&#x5FAA;&#x73AF;&#x7F13;&#x51B2;&#x533A;&#x3002;&#x5B83;&#x4EEC;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x5373;&#x4F7F;&#x5728;&#x7E41;&#x5FD9;&#x7684;&#x7CFB;&#x7EDF;&#x4E2D;&#xFF0C;&#x4E5F;&#x4F1A;&#x8BA9;&#x76F8;&#x5173;&#x7684;&#x7F13;&#x51B2;&#x533A;&#x5B58;&#x6D3B;&#x3002;</p>
<h3 id="dbappender">DBAppender</h3>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/classic/db/DBAppender.html" target="_blank"><code>DBAppender</code></a> &#x4EE5;&#x4E00;&#x79CD;&#x72EC;&#x7ACB;&#x4E8E; JAVA &#x8BED;&#x8A00;&#x7684;&#x65B9;&#x5F0F;&#x5C06;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x63D2;&#x5165;&#x5230;&#x4E09;&#x5F20;&#x6570;&#x636E;&#x5E93;&#x8868;&#x4E2D;&#x3002;</p>
<p>&#x8FD9;&#x4E09;&#x5F20;&#x8868;&#x5206;&#x522B;&#x4E3A;&#xFF1A;<em>logging_event</em>, <em>logging_event_property</em> &#x4E0E; <em>logging_event_exception</em>&#x3002;&#x5728;&#x4F7F;&#x7528; DBAppender &#x4E4B;&#x524D;&#xFF0C;&#x5B83;&#x4EEC;&#x5FC5;&#x987B;&#x5B58;&#x5728;&#x3002;logback &#x81EA;&#x5E26; SQL &#x811A;&#x672C;&#x6765;&#x521B;&#x5EFA;&#x8868;&#x3002;&#x8FD9;&#x4E9B;&#x811A;&#x672C;&#x5728; <em>logback-classic/src/main/java/ch/qos/logback/classic/db/script</em> &#x6587;&#x4EF6;&#x5939;&#x4E0B;&#x3002;&#x6BCF;&#x4E00;&#x79CD;&#x6700;&#x6D41;&#x884C;&#x7684;&#x6570;&#x636E;&#x5E93;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x5BF9;&#x5E94;&#x7684;&#x811A;&#x672C;&#x3002;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x4F60;&#x6307;&#x5B9A;&#x7684;&#x6570;&#x636E;&#x5E93;&#x811A;&#x672C;&#xFF0C;&#x53C2;&#x8003;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x7684;&#x4F8B;&#x5B50;&#xFF0C;&#x53EF;&#x4EE5;&#x5F88;&#x7B80;&#x5355;&#x7684;&#x5199;&#x4E00;&#x4E2A;&#x3002;&#x5982;&#x679C;&#x4F60;&#x628A;&#x4ED6;&#x4EEC;&#x53D1;&#x7ED9;&#x6211;&#x4EEC;&#xFF0C;&#x6211;&#x4EEC;&#x5F88;&#x4E50;&#x610F;&#x5728;&#x5C06;&#x6765;&#x7684;&#x7248;&#x672C;&#x4E2D;&#x53D1;&#x5E03;&#x8FD9;&#x4E9B;&#x811A;&#x672C;&#x3002;</p>
<p>&#x5982;&#x679C;&#x4F60;&#x7684; JDBC &#x9A71;&#x52A8;&#x652F;&#x6301; JDBC 3.0 specification &#x89C4;&#x8303;&#x4E2D;&#x7684; <code>getGeneratedKeys</code> &#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x4E14;&#x4F60;&#x4E5F;&#x521B;&#x5EFA;&#x4E86;&#x4E0A;&#x8FF0;&#x6240;&#x9700;&#x8981;&#x8272;&#x6570;&#x636E;&#x5E93;&#x8868;&#xFF0C;&#x90A3;&#x4E48;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x989D;&#x5916;&#x7684;&#x6B65;&#x9AA4;&#x3002;&#x5426;&#x5219;&#x7684;&#x8BDD;&#xFF0C;&#x4F60;&#x5FC5;&#x987B;&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x9002;&#x5408;&#x4F60;&#x6570;&#x636E;&#x5E93;&#x7684; <code>SQLDialect</code>&#x3002;&#x76EE;&#x524D; logback &#x652F;&#x6301;&#x7684;&#x6570;&#x636E;&#x5E93;&#x65B9;&#x8A00;&#x6709; H2, HSQL, MS SQL Server, MySQL, Oracle, PostgreSQL, SQLLite and Sybase&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x7684;&#x8868;&#x683C;&#x603B;&#x7ED3;&#x4E86;&#x6570;&#x636E;&#x5E93;&#x7C7B;&#x578B;&#xFF0C;&#x4EE5;&#x53CA;&#x5B83;&#x4EEC;&#x662F;&#x5426;&#x652F;&#x6301; <code>getGeneratedKeys()</code> &#x65B9;&#x6CD5;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>RDBMS</th>
<th>&#x6D4B;&#x8BD5;&#x7248;&#x672C;</th>
<th>JDBC &#x9A71;&#x52A8;&#x7684;&#x6D4B;&#x8BD5;&#x7248;&#x672C;</th>
<th>&#x662F;&#x5426;&#x652F;&#x6301; <code>getGeneratedKeys()</code></th>
<th>logback &#x662F;&#x5426;&#x63D0;&#x4F9B;&#x5BF9;&#x5E94;&#x7684;&#x65B9;&#x8A00;</th>
</tr>
</thead>
<tbody>
<tr>
<td>DB2</td>
<td>untested</td>
<td>untested</td>
<td>unknown</td>
<td>NO</td>
</tr>
<tr>
<td>H2</td>
<td>1.2.132</td>
<td>-</td>
<td>unknown</td>
<td>YES</td>
</tr>
<tr>
<td>HSQL</td>
<td>1.8.0.7</td>
<td>-</td>
<td>NO</td>
<td>YES</td>
</tr>
<tr>
<td>Microsoft SQL Server</td>
<td>2005</td>
<td>2.0.1008.2 (sqljdbc.jar)</td>
<td>YES</td>
<td>YES</td>
</tr>
<tr>
<td>MySQL</td>
<td>5.0.22</td>
<td>5.0.8 (mysql-connector.jar)</td>
<td>YES</td>
<td>YES</td>
</tr>
<tr>
<td>PostgreSQL</td>
<td>8.x</td>
<td>8.4-701.jdbc4</td>
<td>NO</td>
<td>YES</td>
</tr>
<tr>
<td>Oracle</td>
<td>10g</td>
<td>10.2.0.1 (ojdbc14.jar)</td>
<td>YES</td>
<td>YES</td>
</tr>
<tr>
<td>SQLLite</td>
<td>3.7.4</td>
<td>-</td>
<td>unknown</td>
<td>YES</td>
</tr>
<tr>
<td>Sybase SQLAnywhere</td>
<td>10.0.1</td>
<td>-</td>
<td>unknown</td>
<td>YES</td>
</tr>
</tbody>
</table>
<p>&#x5728; &quot;&#x6807;&#x51C6;&#x7684;&quot; PC &#x7535;&#x8111;&#x4E0A;&#xFF0C;&#x7ECF;&#x8FC7;&#x6D4B;&#x8BD5;&#xFF0C;&#x5C06;&#x5355;&#x4E2A;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5199;&#x5165;&#x6570;&#x636E;&#x5E93;&#x9700;&#x8981;&#x82B1;&#x8D39;&#x5927;&#x7EA6; 10 &#x6BEB;&#x79D2;&#x3002;&#x5982;&#x679C;&#x4F7F;&#x7528;&#x7EBF;&#x7A0B;&#x6C60;&#xFF0C;&#x5927;&#x7EA6;&#x53EA;&#x9700;&#x8981;&#x82B1;&#x8D39;&#x5927;&#x7EA6; 1 &#x6BEB;&#x79D2;&#x3002;&#x5927;&#x90E8;&#x5206;&#x7684; JDBC &#x9A71;&#x52A8;&#x90FD;&#x652F;&#x6301;&#x8FDE;&#x63A5;&#x6C60;&#x3002;</p>
<blockquote>
<p>&#x4E0D;&#x662F;&#x5F88;&#x61C2;&#x8FD9;&#x4E2A; &quot;&#x6807;&#x51C6;&#x7684;&quot; PC &#x7535;&#x8111;&#xFF0C;&#x5230;&#x5E95;&#x662F;&#x53F0;&#x4EC0;&#x4E48;&#x7535;&#x8111;</p>
</blockquote>
<p>&#x6839;&#x636E;&#x8FDE;&#x63A5;&#x6570;&#x636E;&#x5E93;&#x7684;&#x5DE5;&#x5177;&#x4EE5;&#x53CA;&#x6570;&#x636E;&#x5E93;&#x81EA;&#x8EAB;&#xFF0C;&#x914D;&#x7F6E; logback &#x53BB;&#x4F7F;&#x7528; <code>DBAppender</code> &#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x51E0;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x65B9;&#x5F0F;&#x53BB;&#x5B9E;&#x73B0;&#x3002;&#x6211;&#x4EEC;&#x5F88;&#x5FEB;&#x5C31;&#x4F1A;&#x53D1;&#x73B0;&#xFF0C;&#x914D;&#x7F6E; <code>DBAppender</code> &#x7684;&#x4E3B;&#x8981;&#x95EE;&#x9898;&#x5728;&#x4E8E;&#x5982;&#x4F55;&#x8BBE;&#x7F6E; <code>ConnectionSource</code> &#x5B9E;&#x4F8B;&#x3002;</p>
<p>&#x4E00;&#x65E6;&#x4E3A;&#x6570;&#x636E;&#x5E93;&#x914D;&#x7F6E;&#x4E86; <code>DBAppender</code>&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5C31;&#x4F1A;&#x88AB;&#x53D1;&#x9001;&#x5230;&#x6307;&#x5B9A;&#x7684;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x3002;&#x6839;&#x636E;&#x4E4B;&#x524D;&#x8BF4;&#x7684;&#xFF0C;logback &#x4F7F;&#x7528;&#x4E09;&#x5F20;&#x8868;&#x6765;&#x5B58;&#x50A8;&#x65E5;&#x5FD7;&#x6570;&#x636E;&#x3002;</p>
<p><em>logging_event</em> &#x8868;&#x5305;&#x542B;&#x4E86;&#x4EE5;&#x4E0B;&#x5B57;&#x6BB5;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>timestamp</strong></td>
<td><code>big int</code></td>
<td>&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x521B;&#x5EFA;&#x65F6;&#x95F4;</td>
</tr>
<tr>
<td><strong>formatted_message</strong></td>
<td><code>text</code></td>
<td>&#x7ECF;&#x8FC7; <code>org.slf4j.impl.MessageFormatter</code> &#x683C;&#x5F0F;&#x5316;&#x540E;&#x7684;&#x6D88;&#x606F;</td>
</tr>
<tr>
<td><strong>logger_name</strong></td>
<td><code>varchar</code></td>
<td>&#x53D1;&#x51FA;&#x65E5;&#x5FD7;&#x7684; logger &#x540D;</td>
</tr>
<tr>
<td><strong>level_string</strong></td>
<td><code>varchar</code></td>
<td>&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x7EA7;&#x522B;</td>
</tr>
<tr>
<td><strong>reference_flag</strong></td>
<td><code>smallint</code></td>
<td>&#x7528;&#x6765;&#x8868;&#x793A;&#x662F;&#x5426;&#x662F;&#x5F02;&#x5E38;&#x6216;&#x8005;&#x4E0E; MDC &#x5C5E;&#x6027;&#x76F8;&#x5173;&#x8054;&#x3002;&#x5B83;&#x7684;&#x503C;&#x901A;&#x8FC7; <code>ch.qos.logback.classic.db.DBHelper</code> &#x8BA1;&#x7B97;&#x5F97;&#x5230;&#x3002;&#x65E5;&#x5FD7;&#x65F6;&#x95F4;&#x5305;&#x542B; <code>MDC</code> &#x6216;&#x8005; <code>Context</code> &#x65F6;&#xFF0C;&#x5B83;&#x7684;&#x503C;&#x4E3A; <em>1</em>&#x3002;&#x5305;&#x542B;&#x5F02;&#x5E38;&#x65F6;&#xFF0C;&#x5B83;&#x7684;&#x503C;&#x4E3A; <em>2</em>&#x3002;&#x5305;&#x542B;&#x4E24;&#x8005;&#xFF0C;&#x5219;&#x503C;&#x4E3A; <em>3</em>&#x3002;</td>
</tr>
<tr>
<td><strong>caller_filename</strong></td>
<td><code>varchar</code></td>
<td>&#x53D1;&#x51FA;&#x65E5;&#x5FD7;&#x8BF7;&#x6C42;&#x7684;&#x6587;&#x4EF6;&#x540D;</td>
</tr>
<tr>
<td><strong>caller_class</strong></td>
<td><code>varchar</code></td>
<td>&#x53D1;&#x51FA;&#x65E5;&#x5FD7;&#x8BF7;&#x6C42;&#x7684;&#x7C7B;</td>
</tr>
<tr>
<td><strong>caller_method</strong></td>
<td><code>varchar</code></td>
<td>&#x53D1;&#x51FA;&#x65E5;&#x5FD7;&#x8BF7;&#x6C42;&#x7684;&#x65B9;&#x6CD5;</td>
</tr>
<tr>
<td><strong>caller_line</strong></td>
<td><code>char</code></td>
<td>&#x53D1;&#x51FA;&#x65E5;&#x5FD7;&#x8BF7;&#x6C42;&#x6240;&#x5728;&#x7684;&#x884C;</td>
</tr>
<tr>
<td><strong>event_id</strong></td>
<td><code>int</code></td>
<td>&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5728;&#x6570;&#x636E;&#x5E93;&#x7684; id</td>
</tr>
</tbody>
</table>
<p><em>logging_event_property</em> &#x8868;&#x7528;&#x4E8E;&#x5B58;&#x50A8; <code>MDC</code> &#x6216;&#x8005; <code>Context</code> &#x4E2D;&#x7684; key &#x4E0E; value&#x3002;&#x5B83;&#x5305;&#x542B;&#x5982;&#x4E0B;&#x5B57;&#x6BB5;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>event_id</strong></td>
<td><code>int</code></td>
<td>&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x6570;&#x636E;&#x5E93; id</td>
</tr>
<tr>
<td><strong>mapped_key</strong></td>
<td><code>varchar</code></td>
<td><code>MDC</code> &#x5C5E;&#x6027;&#x7684; key</td>
</tr>
<tr>
<td><strong>mapped_value</strong></td>
<td><code>text</code></td>
<td><code>MDC</code> &#x5C5E;&#x6027;&#x7684; value</td>
</tr>
</tbody>
</table>
<p><em>logging_event_exception</em> &#x8868;&#x5305;&#x542B;&#x5982;&#x4E0B;&#x5B57;&#x6BB5;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>event_id</strong></td>
<td><code>int</code></td>
<td>&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x6570;&#x636E;&#x5E93; id</td>
</tr>
<tr>
<td><strong>i</strong></td>
<td><code>smallint</code></td>
<td>&#x5806;&#x6808;&#x6240;&#x5728;&#x7684;&#x884C;</td>
</tr>
<tr>
<td><strong>trace_line</strong></td>
<td><code>varchar</code></td>
<td>&#x76F8;&#x5BF9;&#x5E94;&#x7684;&#x5806;&#x6808;&#x4FE1;&#x606F;</td>
</tr>
</tbody>
</table>
<p>&#x4E0B;&#x9762;&#x7ED9;&#x51FA;&#x4E00;&#x4E2A;&#x66F4;&#x52A0;&#x76F4;&#x89C2;&#x7684;&#x793A;&#x4F8B;&#xFF0C;&#x622A;&#x56FE;&#x4E0A;&#x9762;&#x7684;&#x4FE1;&#x606F;&#x662F; MySQL &#x6570;&#x636E;&#x4E2D; <code>DBAppender</code> &#x63D0;&#x4F9B;&#x7684;&#x5185;&#x5BB9;&#x3002;</p>
<p>&#x8868; <em>logging_event</em>&#xFF1A;</p>
<p><img src="images/dbAppenderLE.gif" alt="dbAppenderLE"></p>
<p>&#x8868; <em>logging_event_exception</em>&#xFF1A;</p>
<p><img src="images/dbAppenderLEException.gif" alt="dbAppenderLEException"></p>
<p>&#x8868; <em>logging_event_property</em>&#xFF1A;</p>
<p><img src="images/dbAppenderLEProperty.gif" alt="dbAppenderLEProperty"></p>
<h4 id="connectionsource">ConnectionSource</h4>
<p><code>ConnectionSource</code> &#x63A5;&#x53E3;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x79CD;&#x53EF;&#x63D2;&#x62D4;&#x5F0F;&#x7684;&#x65B9;&#x5F0F;&#x4E3A;&#x9700;&#x8981;&#x4F7F;&#x7528; <code>java.sql.Connection</code> &#x7684; logback &#x7C7B;&#x83B7;&#x53D6; JDBC &#x8FDE;&#x63A5;&#x3002;<code>ConnectionSource</code> &#x76EE;&#x524D;&#x6709;&#x4E09;&#x79CD;&#x5B9E;&#x73B0;&#xFF0C;&#x5206;&#x522B;&#x4E3A;&#xFF1A;<code>DataSourceConnectionSource&#xFF0C;</code> <code>DriverManagerConnectionSource</code> &#x4E0E; <code>JNDIConnectionSource</code>&#x3002;</p>
<p>&#x7B2C;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x6211;&#x4EEC;&#x4F7F;&#x7528; <code>DriverManagerConnectionSource</code> &#x4E0E; MySQL database&#xFF0C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<blockquote>
<p>Example: append-toMySQL-with-driverManager.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;DB&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.db.DBAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">connectionSource</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.db.DriverManagerConnectionSource&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">driverClass</span>&gt;</span>com.mysql.jdbc.Driver<span class="hljs-tag">&lt;/<span class="hljs-name">driverClass</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">url</span>&gt;</span>jdbc:mysql://host_name:3306/datebase_name<span class="hljs-tag">&lt;/<span class="hljs-name">url</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">user</span>&gt;</span>username<span class="hljs-tag">&lt;/<span class="hljs-name">user</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>password<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">connectionSource</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span> &gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;DB&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x5FC5;&#x987B;&#x6B63;&#x786E;&#x914D;&#x7F6E; JDBC &#x9A71;&#x52A8;&#xFF0C;&#x8FD9;&#x91CC;&#x4F7F;&#x7528; <code>com.mysql.jdbc.Driver</code>&#x3002;<code>url</code> &#x5FC5;&#x987B;&#x4EE5; <em>jdbc:mysql://</em> &#x5F00;&#x5934;&#x3002;</p>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/db/DriverManagerConnectionSource.html" target="_blank"><code>DriverManagerConnectionSource</code></a> &#x5B9E;&#x73B0;&#x4E86; <code>ConnectionSource</code> &#x63A5;&#x53E3;&#xFF0C;&#x901A;&#x8FC7;&#x57FA;&#x4E8E; URL &#x7684;&#x4F20;&#x7EDF; JDBC &#x65B9;&#x5F0F;&#x6765;&#x83B7;&#x53D6;&#x8FDE;&#x63A5;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x7C7B;&#x4E3A;&#x6BCF;&#x4E00;&#x4E2A;&#x8C03;&#x7528; <code>getConnection()</code> &#x7684;&#x65B9;&#x6CD5;&#x90FD;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A; <code>Connection</code> &#x8FDE;&#x63A5;&#x3002;&#x63A8;&#x8350;&#x4F60;&#x4F7F;&#x7528;&#x672C;&#x5730;&#x652F;&#x6301;&#x7684;&#x8FDE;&#x63A5;&#x6C60;&#x7684; JDBC &#x9A71;&#x52A8;&#xFF0C;&#x6216;&#x8005;&#x521B;&#x5EFA;&#x4F60;&#x81EA;&#x5DF1;&#x5B9E;&#x73B0;&#x7684; <code>ConnectionSource</code>&#xFF0C;&#x57FA;&#x4E8E;&#x4F60;&#x5DF2;&#x7ECF;&#x4F7F;&#x7528;&#x7684;&#x4EFB;&#x4F55;&#x8FDE;&#x63A5;&#x6C60;&#x673A;&#x5236;&#x3002;&#x5982;&#x679C;&#x4F60;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x652F;&#x6301; <code>javax.sql.DataSource</code> &#x7684; JNDI &#x5B9E;&#x73B0;&#xFF0C;&#x4F8B;&#x5982;&#xFF0C;&#x5728; J2EE &#x5E94;&#x7528;&#x670D;&#x52A1;&#x4E2D;&#xFF0C;&#x53C2;&#x89C1;&#x4E0B;&#x9762;&#x7684; <a href="https://logback.qos.ch/manual/appenders.html#JNDIConnectionSource" target="_blank"><code>JNDIConnectionSource</code></a>&#x3002;</p>
<blockquote>
<p>Example: append-with-datasource.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>  <span class="hljs-attr">debug</span>=<span class="hljs-string">&quot;true&quot;</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;DB&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.db.DBAppender&quot;</span>&gt;</span>
     <span class="hljs-tag">&lt;<span class="hljs-name">connectionSource</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.db.DataSourceConnectionSource&quot;</span>&gt;</span>

       <span class="hljs-tag">&lt;<span class="hljs-name">dataSource</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;${dataSourceClass}&quot;</span>&gt;</span>
         <span class="hljs-comment">&lt;!-- Joran &#x4E0D;&#x80FD;&#x66FF;&#x6362;&#x4E0D;&#x662F;&#x5C5E;&#x6027;&#x7684;&#x53D8;&#x91CF;&#x3002;&#x56E0;&#x6B64;&#x6211;&#x4EEC;&#x4E0D;&#x80FD;&#x50CF;&#x5176;&#x5B83;&#x53D8;&#x91CF;&#x4E00;&#x6837;&#x58F0;&#x660E;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x53D8;&#x91CF;
         --&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;${url-key:-url}&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;${url_value}&quot;</span>/&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">serverName</span>&gt;</span>${serverName}<span class="hljs-tag">&lt;/<span class="hljs-name">serverName</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">databaseName</span>&gt;</span>${databaseName}<span class="hljs-tag">&lt;/<span class="hljs-name">databaseName</span>&gt;</span>
       <span class="hljs-tag">&lt;/<span class="hljs-name">dataSource</span>&gt;</span>

       <span class="hljs-tag">&lt;<span class="hljs-name">user</span>&gt;</span>${user}<span class="hljs-tag">&lt;/<span class="hljs-name">user</span>&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>${password}<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>
     <span class="hljs-tag">&lt;/<span class="hljs-name">connectionSource</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;INFO&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;DB&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x5927;&#x91CF;&#x4F7F;&#x7528;&#x4E86;&#x53D8;&#x91CF;&#x66FF;&#x6362;&#x3002;&#x5F53;&#x9700;&#x8981;&#x628A;&#x4E00;&#x4E9B;&#x8FDE;&#x63A5;&#x7684;&#x7EC6;&#x8282;&#x96C6;&#x4E2D;&#x5728;&#x4E00;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x5E76;&#x4E14;&#x901A;&#x8FC7; logback &#x4E0E;&#x5176;&#x5B83;&#x6846;&#x67B6;&#x5171;&#x4EAB;&#x65F6;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x3002;</p>
<h4 id="jndiconnectionsource">JNDIConnectionSource</h4>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/core/db/JNDIConnectionSource.html" target="_blank"><code>JNDIConnectionSource</code></a> &#x662F; logback &#x81EA;&#x5E26;&#x7684;&#xFF0C;<code>ConnectionSource</code> &#x7684;&#x53E6;&#x4E00;&#x79CD;&#x5B9E;&#x73B0;&#x3002;&#x4ECE;&#x540D;&#x5B57;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x6765;&#xFF0C;&#x5B83;&#x901A;&#x8FC7; JNDI   &#x83B7;&#x53D6; <code>javax.sql.DataSource</code>&#xFF0C;&#x7136;&#x540E;&#x518D;&#x83B7;&#x53D6; <code>java.sql.Connection</code> &#x5B9E;&#x4F8B;&#x3002;<code>JNDIConnectionSource</code> &#x4E3B;&#x8981;&#x8BBE;&#x8BA1;&#x7528;&#x5728; J2EE &#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x4EE5;&#x53CA;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x5BA2;&#x6237;&#x7AEF;&#x4E2D;&#xFF0C;&#x8FD9;&#x91CC;&#x5047;&#x8BBE;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x652F;&#x6301;&#x8FDC;&#x7A0B;&#x83B7;&#x53D6; <code>javax.sql.DataSource</code>&#x3002;&#x56E0;&#x4E3A;&#x53EF;&#x4EE5;&#x5229;&#x7528;&#x8FDE;&#x63A5;&#x6C60;&#x6216;&#x8005;&#x5176;&#x5B83;&#x5E94;&#x7528;&#x670D;&#x52A1;&#x5668;&#x6240;&#x63D0;&#x4F9B;&#x7684;&#x597D;&#x5904;&#x3002;&#x66F4;&#x52A0;&#x91CD;&#x8981;&#x7684;&#x662F;&#xFF0C;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x4E0D;&#x9700;&#x8981;&#x505A;&#x91CD;&#x590D;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x56E0;&#x4E3A;&#x4E0D;&#x9700;&#x8981;&#x5728; <em>logback.xml</em> &#x4E2D;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A; <code>DataSource</code>&#x3002;</p>
<p>&#x4F8B;&#x5982;&#xFF0C;&#x4E0B;&#x9762;&#x7684;&#x662F;&#x5173;&#x4E8E; Tomcat &#x7684;&#x4E00;&#x4E2A;&#x914D;&#x7F6E;&#x7247;&#x6BB5;&#xFF0C;&#x5B83;&#x662F;&#x57FA;&#x4E8E; PostgreSQL&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x4E0A;&#x9762;&#x63D0;&#x5230;&#x5176;&#x5B83;&#x6570;&#x636E;&#x4E5F;&#x53EF;&#x4EE5;&#x3002;</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">Context</span> <span class="hljs-attr">docBase</span>=<span class="hljs-string">&quot;/path/to/app.war&quot;</span> <span class="hljs-attr">path</span>=<span class="hljs-string">&quot;/myapp&quot;</span>&gt;</span>
  ...
  <span class="hljs-tag">&lt;<span class="hljs-name">Resource</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;jdbc/logging&quot;</span>
               <span class="hljs-attr">auth</span>=<span class="hljs-string">&quot;Container&quot;</span>
               <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;javax.sql.DataSource&quot;</span>
               <span class="hljs-attr">username</span>=<span class="hljs-string">&quot;...&quot;</span>
               <span class="hljs-attr">password</span>=<span class="hljs-string">&quot;...&quot;</span>
               <span class="hljs-attr">driverClassName</span>=<span class="hljs-string">&quot;org.postgresql.Driver&quot;</span>
               <span class="hljs-attr">url</span>=<span class="hljs-string">&quot;jdbc:postgresql://localhost/...&quot;</span>
               <span class="hljs-attr">maxActive</span>=<span class="hljs-string">&quot;8&quot;</span>
               <span class="hljs-attr">maxIdle</span>=<span class="hljs-string">&quot;4&quot;</span>/&gt;</span>
  ...
<span class="hljs-tag">&lt;/<span class="hljs-name">Context</span>&gt;</span>
</code></pre>
<p>&#x4E00;&#x65E6; <code>DataSource</code> &#x5728;&#x4F60;&#x7684; J2EE &#x670D;&#x52A1;&#x4E2D;&#x5B9A;&#x4E49;&#x4E86;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x8F7B;&#x677E;&#x7684;&#x5728; logback &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x5F15;&#x7528;&#x3002;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;</p>
<blockquote>
<p>Example: append-via-jndi.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span> <span class="hljs-attr">debug</span>=<span class="hljs-string">&quot;true&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;DB&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.db.DBAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">connectionSource</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.db.JNDIConnectionSource&quot;</span>&gt;</span>
      <span class="hljs-comment">&lt;!-- please note the &quot;java:comp/env/&quot; prefix --&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">jndiLocation</span>&gt;</span>java:comp/env/jdbc/logging<span class="hljs-tag">&lt;/<span class="hljs-name">jndiLocation</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">connectionSource</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;INFO&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;DB&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>  
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x7C7B;&#x901A;&#x8FC7;&#x5348;&#x9910;&#x6784;&#x9020;&#x51FD;&#x6570;&#x83B7;&#x53D6;&#x4E00;&#x4E2A; <code>javax.naming.InitialContext</code>&#x3002;&#x5728; J2EE &#x73AF;&#x5883;&#x901A;&#x5E38;&#x53EF;&#x4EE5;&#x884C;&#x5F97;&#x901A;&#x3002;&#x4F46;&#x662F;&#x5728; J2EE &#x73AF;&#x5883;&#x4E4B;&#x5916;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x6839;&#x636E; JNDI &#x63D0;&#x4F9B;&#x8005;&#x7684;&#x6587;&#x6863;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A; <em>jndi.properties</em> &#x5C5E;&#x6027;&#x6587;&#x4EF6;&#x3002;</p>
<h4 id="&#x8FDE;&#x63A5;&#x6C60;">&#x8FDE;&#x63A5;&#x6C60;</h4>
<p>&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x53EF;&#x4EE5;&#x5F88;&#x5FEB;&#x7684;&#x88AB;&#x521B;&#x5EFA;&#x3002;&#x4E3A;&#x4E86;&#x8BA9;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x90FD;&#x80FD;&#x88AB;&#x63D2;&#x5165;&#x5230;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x63A8;&#x8350; <code>DBAppender</code> &#x4F7F;&#x7528;&#x8FDE;&#x63A5;&#x6C60;&#x914D;&#x7F6E;&#x3002;</p>
<p>&#x7ECF;&#x8FC7;&#x5B9E;&#x9A8C;&#x53D1;&#x73B0;&#xFF0C;&#x4F7F;&#x7528;&#x8FDE;&#x63A5;&#x6C60;&#xFF0C;&#x53EF;&#x4EE5;&#x8BA9; <code>DBAppender</code> &#x6709;&#x5927;&#x5E45;&#x7684;&#x6027;&#x80FD;&#x63D0;&#x5347;&#x3002;&#x4E0B;&#x9762;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x5C06;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x53D1;&#x9001;&#x7ED9; MySQL&#xFF0C;&#x6CA1;&#x6709;&#x4F7F;&#x7528;&#x8FDE;&#x63A5;&#x6C60;&#x3002;</p>
<blockquote>
<p>Example: append-toMySQL-with-datasource.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;DB&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.db.DBAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">connectionSource</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.db.DataSourceConnectionSource&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">dataSource</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;com.mysql.jdbc.jdbc2.optional.MysqlDataSource&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">serverName</span>&gt;</span>${serverName}<span class="hljs-tag">&lt;/<span class="hljs-name">serverName</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">port</span>&gt;</span>${port$<span class="hljs-tag">&lt;/<span class="hljs-name">port</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">databaseName</span>&gt;</span>${dbName}<span class="hljs-tag">&lt;/<span class="hljs-name">databaseName</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">user</span>&gt;</span>${user}<span class="hljs-tag">&lt;/<span class="hljs-name">user</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>${pass}<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">dataSource</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">connectionSource</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;DB&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x5728;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x53D1;&#x9001; 500 &#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5230; MySQL &#x6570;&#x636E;&#x5E93;&#xFF0C;&#x9700;&#x8981;&#x9AD8;&#x8FBE; 5 &#x79D2;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x76F8;&#x5F53;&#x6BCF;&#x6761;&#x8BF7;&#x6C42;&#x9700;&#x8981; 10 &#x6BEB;&#x79D2;&#x3002;&#x5728;&#x5927;&#x578B;&#x7684;&#x5E94;&#x7528;&#x4E2D;&#xFF0C;&#x8FD9;&#x4E2A;&#x6570;&#x5B57;&#x662F;&#x4E0D;&#x80FD;&#x591F;&#x88AB;&#x63A5;&#x53D7;&#x7684;&#x3002;</p>
<p><code>DBAppender</code> &#x8FDE;&#x63A5;&#x6C60;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x4E13;&#x4E1A;&#x7684;&#x5916;&#x90E8;&#x5E93;&#x3002;&#x4E0B;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#x4F7F;&#x7528; <a href="http://sourceforge.net/projects/c3p0" target="_blank">c3p0</a>&#x3002;&#x4E3A;&#x4E86;&#x4F7F;&#x7528; c2p0&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x4E0B;&#x8F7D;&#x5E76;&#x5C06; <em>c3p0-VERSION.jar</em> &#x653E;&#x5728;&#x7C7B;&#x8DEF;&#x5F84;&#x4E0B;&#x3002;</p>
<blockquote>
<p>Example: append-toMySQL-with-datasource-and-pooling.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;DB&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.db.DBAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">connectionSource</span>
      <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.db.DataSourceConnectionSource&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">dataSource</span>
        <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;com.mchange.v2.c3p0.ComboPooledDataSource&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">driverClass</span>&gt;</span>com.mysql.jdbc.Driver<span class="hljs-tag">&lt;/<span class="hljs-name">driverClass</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">jdbcUrl</span>&gt;</span>jdbc:mysql://${serverName}:${port}/${dbName}<span class="hljs-tag">&lt;/<span class="hljs-name">jdbcUrl</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">user</span>&gt;</span>${user}<span class="hljs-tag">&lt;/<span class="hljs-name">user</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>${password}<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">dataSource</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">connectionSource</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;DB&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x65B0;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x53D1;&#x9001; 500 &#x6761;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5230; MySQL &#x6570;&#x636E;&#x5E93;&#x5927;&#x7EA6;&#x9700;&#x8981; 0.5 &#x79D2;&#xFF0C;&#x5927;&#x7EA6; 1 &#x6BEB;&#x79D2;&#x4E00;&#x6761;&#x8BF7;&#x6C42;&#xFF0C;&#x6027;&#x80FD;&#x63D0;&#x5347;&#x4E86;&#x5341;&#x500D;&#x3002;</p>
<h3 id="syslogappender">SyslogAppender</h3>
<p>syslog &#x534F;&#x8BAE;&#x975E;&#x5E38;&#x7684;&#x7B80;&#x5355;&#xFF1A;syslog &#x53D1;&#x9001;&#x8005;&#x5C06;&#x4FE1;&#x606F;&#x53D1;&#x9001;&#x7ED9; syslog &#x63A5;&#x6536;&#x8005;&#x3002;&#x63A5;&#x6536;&#x8005;&#x901A;&#x5E38;&#x53EB;&#x505A; <em>syslog &#x5B88;&#x62A4;&#x7EBF;&#x7A0B;</em> &#x6216;&#x8005; <em>syslog &#x670D;&#x52A1;&#x5668;</em>&#x3002;logback &#x53EF;&#x4EE5;&#x628A;&#x6D88;&#x606F;&#x53D1;&#x9001;&#x7ED9;&#x8FDC;&#x7A0B;&#x7684; syslog &#x5B88;&#x62A4;&#x7EBF;&#x7A0B;&#x3002;&#x901A;&#x8FC7; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/net/SyslogAppender.html" target="_blank"><code>SyslogAppender</code></a> &#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x662F; SyslogAppender &#x7684;&#x5C5E;&#x6027;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x5C5E;&#x6027;&#x540D;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>syslogHost</strong></td>
<td><code>String</code></td>
<td>syslog &#x670D;&#x52A1;&#x5668;&#x7684;&#x4E3B;&#x673A;&#x540D;</td>
</tr>
<tr>
<td><strong>port</strong></td>
<td><code>String</code></td>
<td>&#x7528;&#x6765; syslog &#x670D;&#x52A1;&#x5668;&#x7684;&#x7AEF;&#x53E3;&#x53F7;&#x3002;&#x9ED8;&#x8BA4;&#x7AEF;&#x53E3;&#x4E3A; 514&#xFF0C;&#x8FD9;&#x4E2A;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x4FEE;&#x6539;&#x3002;</td>
</tr>
<tr>
<td><strong>facility</strong></td>
<td><code>String</code></td>
<td>&#x7528;&#x6765;&#x786E;&#x5B9A;&#x6D88;&#x606F;&#x7684;&#x6765;&#x6E90;&#x3002;<br>&#x5B83;&#x7684;&#x503C;&#x5FC5;&#x987B;&#x4E3A; <em>KERN, USER, MAIL, DAEMON, AUTH, SYSLOG, LPR, NEWS, UUCP, CRON, AUTHPRIV, FTP, NTP, AUDIT, ALERT, CLOCK, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7</em> &#x5176;&#x4E2D;&#x4E4B;&#x4E00;&#x3002;&#x5927;&#x5C0F;&#x5199;&#x4E0D;&#x654F;&#x611F;</td>
</tr>
<tr>
<td><strong>suffixPattern</strong></td>
<td><code>String</code></td>
<td>&#x8BE5;&#x5C5E;&#x6027;&#x6307;&#x5B9A;&#x53D1;&#x9001;&#x5230; syslog &#x670D;&#x52A1;&#x5668;&#x7684;&#x6D88;&#x606F;&#x975E;&#x6807;&#x51C6;&#x90E8;&#x5206;&#x7684;&#x683C;&#x5F0F;&#x3002;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5B83;&#x7684;&#x503C;&#x4E3A; <em>[%thread] %logger %msg</em>&#x3002;<code>PatternLayout</code> &#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7684;&#x4EFB;&#x4F55;&#x503C;&#x90FD;&#x662F;&#x6B63;&#x786E;&#x7684; suffixPattern &#x503C;&#x3002;</td>
</tr>
<tr>
<td><strong>stackTracePattern</strong></td>
<td><code>String</code></td>
<td>&#x8BE5;&#x5C5E;&#x6027;&#x5141;&#x8BB8;&#x5B9A;&#x5236;&#x51FA;&#x73B0;&#x5728;&#x6BCF;&#x4E2A;&#x5806;&#x6808;&#x884C;&#x524D;&#x9762;&#x7684;&#x5B57;&#x7B26;&#x3002;&#x9ED8;&#x8BA4;&#x7684;&#x503C;&#x4E3A; &quot;\t&quot;&#xFF0C;&#x5373;&#x5236;&#x8868;&#x7B26;&#x3002;<code>PatternLayout</code> &#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7684;&#x4EFB;&#x4F55;&#x503C;&#x90FD;&#x662F;&#x6B63;&#x786E;&#x7684;  stackTracePattern &#x503C;&#x3002;</td>
</tr>
<tr>
<td><strong>throwableExcluded</strong></td>
<td><code>boolean</code></td>
<td>&#x8BBE;&#x7F6E;&#x8BE5;&#x5C5E;&#x6027;&#x7684;&#x503C;&#x4E3A; <code>true</code>&#xFF0C;&#x4F1A;&#x5BFC;&#x81F4;&#x5806;&#x6808;&#x4FE1;&#x606F;&#x88AB;&#x5FFD;&#x7565;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; <code>false</code>&#xFF0C;&#x6240;&#x4EE5;&#x5806;&#x6808;&#x4FE1;&#x606F;&#x53EF;&#x4EE5;&#x88AB;&#x53D1;&#x9001;&#x7ED9; syslog &#x670D;&#x52A1;&#x5668;&#x3002;</td>
</tr>
</tbody>
</table>
<p>&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684; syslog &#x4E25;&#x91CD;&#x7A0B;&#x5EA6;&#x662F;&#x6839;&#x636E;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x7EA7;&#x522B;&#x8F6C;&#x6362;&#x6765;&#x7684;&#x3002;<em>DEBUG</em> &#x88AB;&#x8F6C;&#x6362;&#x4E3A; <em>7</em>&#xFF0C;<em>INFO</em> &#x88AB;&#x8F6C;&#x6362;&#x4E3A; <em>6</em>&#xFF0C;<em>WARN</em> &#x88AB;&#x8F6C;&#x6362;&#x4E3A; <em>4</em>&#xFF0C;<em>ERROR</em> &#x88AB;&#x8F6C;&#x6362;&#x4E3A; <em>3</em>&#x3002;</p>
<p>&#x56E0;&#x4E3A; syslog &#x8BF7;&#x6C42;&#x7684;&#x683C;&#x5F0F;&#x975E;&#x5E38;&#x4E25;&#x683C;&#xFF0C;&#x6240;&#x4EE5; <code>SyslogAppender</code> &#x6CA1;&#x6709;&#x4EFB;&#x4F55; layout&#x3002;&#x4F46;&#x662F;&#x4F7F;&#x7528; <code>suffixPattern</code> &#x53EF;&#x4EE5;&#x8BA9;&#x7528;&#x6237;&#x5C55;&#x793A;&#x4ED6;&#x60F3;&#x5C55;&#x793A;&#x7684;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x4E3A; <code>SyslogAppender</code> &#x7684;&#x914D;&#x7F6E;&#x793A;&#x4F8B;&#xFF1A;</p>
<blockquote>
<p>Example: logback-syslog.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;SYSLOG&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.net.SyslogAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">syslogHost</span>&gt;</span>remote_home<span class="hljs-tag">&lt;/<span class="hljs-name">syslogHost</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">facility</span>&gt;</span>AUTH<span class="hljs-tag">&lt;/<span class="hljs-name">facility</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">suffixPattern</span>&gt;</span>[%thread] %logger %msg<span class="hljs-tag">&lt;/<span class="hljs-name">suffixPattern</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;SYSLOG&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x5728;&#x5BF9;&#x8FD9;&#x4E2A;&#x914D;&#x7F6E;&#x8FDB;&#x884C;&#x6D4B;&#x8BD5;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5E94;&#x8BE5;&#x5148;&#x9A8C;&#x8BC1;&#x8FDC;&#x7A0B; syslog &#x5B88;&#x62A4;&#x7EBF;&#x7A0B;&#x662F;&#x5426;&#x80FD;&#x591F;&#x63A5;&#x6536;&#x5916;&#x90E8;&#x7684;&#x8D44;&#x6E90;&#x3002;&#x6839;&#x636E;&#x4EE5;&#x5F80;&#x7684;&#x7ECF;&#x9A8C;&#xFF0C;syslog &#x5B88;&#x62A4;&#x8FDB;&#x7A0B;&#x901A;&#x5E38;&#x4F1A;&#x62D2;&#x7EDD;&#x6765;&#x81EA;&#x7F51;&#x7EDC;&#x7684;&#x8BF7;&#x6C42;&#x3002;</p>
<h3 id="siftingappender">SiftingAppender</h3>
<p>&#x5982;&#x540D;&#x5B57;&#x6240;&#x793A;&#xFF0C;<code>SiftingAppender</code> &#x6839;&#x636E;&#x7ED9;&#x5B9A;&#x7684;&#x8FD0;&#x884C;&#x65F6;&#x5C5E;&#x6027;&#x5206;&#x79BB;&#x6216;&#x8005;&#x8FC7;&#x6EE4;&#x65E5;&#x5FD7;&#x3002;&#x4F8B;&#x5982;&#xFF0C;<code>SiftingAppender</code> &#x53EF;&#x4EE5;&#x6839;&#x636E;&#x7528;&#x6237;&#x7684; session &#x5206;&#x79BB;&#x65E5;&#x5FD7;&#xFF0C;&#x56E0;&#x6B64;&#x4E0D;&#x540C;&#x7684;&#x7528;&#x6237;&#x7684;&#x65E5;&#x5FD7;&#x4F1A;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#xFF0C;&#x4E00;&#x4E2A;&#x7528;&#x6237;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x3002;</p>
<table>
<thead>
<tr>
<th>&#x5C5E;&#x6027;&#x540D;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>timeout</strong></td>
<td><a href="https://logback.qos.ch/apidocs/ch/qos/logback/core/util/Duration.html" target="_blank">Duration</a></td>
<td>&#x4E00;&#x4E2A;&#x5185;&#x7F6E;&#x7684; appender &#x5982;&#x679C;&#x5728;&#x6307;&#x5B9A; <code>timeout</code> &#x65F6;&#x95F4;&#x5185;&#x6CA1;&#x6709;&#x88AB;&#x8BBF;&#x95EE;&#xFF0C;&#x5219;&#x88AB;&#x8BA4;&#x4E3A;&#x662F;&#x8FC7;&#x65F6;&#x7684;&#x3002;&#x4E00;&#x4E2A;&#x8FC7;&#x65F6;&#x7684; appender &#x4F1A;&#x88AB;&#x5173;&#x95ED;&#xFF0C;&#x5E76;&#x4E14;&#x4E0D;&#x4F1A;&#x88AB; <code>SiftingAppende</code> &#x6240;&#x5F15;&#x7528;&#x3002;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; 30 &#x5206;&#x949F;</td>
</tr>
<tr>
<td><strong>maxAppenderCount</strong></td>
<td><code>integer</code></td>
<td><code>SiftingAppender</code> &#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x5E76;&#x4E14;&#x8DDF;&#x8E2A;&#x5185;&#x7F6E; appender &#x7684;&#x6700;&#x5927;&#x6570;&#x91CF;&#x3002;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A; Integer.MAX_VALUE</td>
</tr>
</tbody>
</table>
<p><code>SiftingAppender</code> &#x901A;&#x8FC7;&#x52A8;&#x6001;&#x521B;&#x5EFA;&#x6765;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x3002;<code>SiftingAppender</code> &#x901A;&#x8FC7;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x6307;&#x5B9A;&#x7684;&#x6A21;&#x677F; (&#x901A;&#x8FC7;&#x95ED;&#x5408;&#x7684; <code>&lt;sift&gt;</code> &#x5143;&#x7D20;&#xFF0C;&#x89C1;&#x4E0B;&#x9762;&#x7684;&#x4F8B;&#x5B50;) &#x6765;&#x521B;&#x5EFA;&#x5185;&#x7F6E;&#x7684; appender&#x3002;<code>SiftingAppender</code> &#x8D1F;&#x8D23;&#x7BA1;&#x7406;&#x5B50; appender &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;&#x4F8B;&#x5982;&#xFF0C;<code>SiftingAppender</code> &#x4F1A;&#x81EA;&#x52A8;&#x5173;&#x95ED;&#x5E76;&#x79FB;&#x9664;&#x4EFB;&#x4F55;&#x8FC7;&#x65F6;&#x7684; appender&#x3002;&#x5728;&#x6307;&#x5B9A;&#x7684; <code>timeout</code> &#x65F6;&#x95F4;&#x5185;&#x6CA1;&#x6709;&#x88AB;&#x8BBF;&#x95EE;&#x8FC7;&#x7684;&#x5185;&#x7F6E; appender&#xFF0C;&#x88AB;&#x8BA4;&#x4E3A;&#x662F;&#x8FC7;&#x65F6;&#x7684;&#x3002;</p>
<p>&#x5728;&#x5904;&#x7406;&#x4E00;&#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x65F6;&#xFF0C;<code>SiftingAppender</code> &#x4F1A;&#x59D4;&#x6258;&#x4E00;&#x4E2A;&#x5B50; appender &#x53BB;&#x8FDB;&#x884C;&#x5904;&#x7406;&#x3002;&#x9009;&#x62E9;&#x7684;&#x6807;&#x51C6;&#x662F;&#x901A;&#x8FC7; discriminator &#x5728;&#x8FD0;&#x884C;&#x65F6;&#x8BA1;&#x7B97;&#x3002;&#x7528;&#x6237;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <a href="https://logback.qos.ch/xref/ch/qos/logback/core/sift/Discriminator.html" target="_blank">Discriminator</a> &#x6765;&#x6307;&#x5B9A;&#x4E00;&#x4E2A;&#x9009;&#x62E9;&#x6807;&#x51C6;&#x3002;&#x8BA9;&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x793A;&#x4F8B;&#x6765;&#x5B66;&#x4E60;&#x4E00;&#x4E0B;&#x3002;</p>
<h4 id="&#x793A;&#x4F8B;">&#x793A;&#x4F8B;</h4>
<p><a href="https://logback.qos.ch/xref/chapters/appenders/sift/SiftExample.html" target="_blank">SiftExample</a> &#x5E94;&#x7528;&#x901A;&#x8FC7;&#x6253;&#x5370;&#x65E5;&#x5FD7;&#x6765;&#x8868;&#x660E;&#x5E94;&#x7528;&#x5DF2;&#x7ECF;&#x542F;&#x52A8;&#x3002;&#x901A;&#x8FC7; MDC &#x8BBE;&#x7F6E;&#x952E; &quot;userid&quot; &#x5BF9;&#x5E94;&#x7684;&#x503C;&#x4E3A; &quot;Alice&quot;&#xFF0C;&#x5E76;&#x6253;&#x5370;&#x4E86;&#x4E00;&#x6761;&#x65E5;&#x5FD7;&#x4FE1;&#x606F;&#x3002;&#x4E0B;&#x9762;&#x662F;&#x4E3B;&#x8981;&#x7684;&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="lang-java">logger.debug(<span class="hljs-string">&quot;Application started&quot;</span>);
MDC.put(<span class="hljs-string">&quot;userid&quot;</span>, <span class="hljs-string">&quot;Alice&quot;</span>);
logger.debug(<span class="hljs-string">&quot;Alice says hello&quot;</span>);
</code></pre>
<p><code>SiftingAppender</code> &#x5728;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x4F7F;&#x7528;&#x6A21;&#x677F;&#x7684;&#x793A;&#x4F8B;&#x5982;&#x4E0B;&#xFF1A;</p>
<blockquote>
<p>Example: byUserid.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE_NAME&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;FILE&quot;</span> /&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;SIFT&quot;</span>
        <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.sift.SiftingAppender&quot;</span>&gt;</span>
        <span class="hljs-comment">&lt;!-- &#x5728;&#x7F3A;&#x5C11; class &#x5C5E;&#x6027;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x9ED8;&#x8BA4;&#x7684; discriminator &#x7C7B;&#x578B;&#x4E3A;                                          ch.qos.logback.classic.sift.MDCBasedDiscriminator --&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">discriminator</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">key</span>&gt;</span>userid<span class="hljs-tag">&lt;/<span class="hljs-name">key</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">defaultValue</span>&gt;</span>unknown<span class="hljs-tag">&lt;/<span class="hljs-name">defaultValue</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">discriminator</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">sift</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE-${userid}&quot;</span>
                <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.FileAppender&quot;</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>${userid}_${FILE_NAME}.log<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">append</span>&gt;</span>false<span class="hljs-tag">&lt;/<span class="hljs-name">append</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.PatternLayout&quot;</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%d [%thread] %level %mdc %logger{35} - %msg%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">layout</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">sift</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;SIFT&quot;</span> /&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x5728;&#x6CA1;&#x6709; class &#x5C5E;&#x6027;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x9ED8;&#x8BA4;&#x7684; discriminator &#x7C7B;&#x578B;&#x4E3A; <a href="https://logback.qos.ch/xref/ch/qos/logback/classic/sift/MDCBasedDiscriminator.html" target="_blank">MDCBasedDiscriminator</a>&#x3002;discriminator &#x7684;&#x7684;&#x503C;&#x4E3A; MDC &#x7684; key &#x6240;&#x5BF9;&#x5E94;&#x7684;&#x503C;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x5982;&#x679C; MDC &#x7684;&#x503C;&#x4E3A; null&#xFF0C;&#x90A3;&#x4E48; <code>defaultValue</code> &#x7684;&#x5C06;&#x4E3A; discriminator &#x7684;&#x503C;&#x3002;</p>
<p><code>SiftingAppender</code> &#x7684;&#x72EC;&#x7279;&#x4E4B;&#x5904;&#x5728;&#x4E8E;&#x5B83;&#x6709;&#x80FD;&#x529B;&#x53BB;&#x5F15;&#x7528;&#x4EE5;&#x53CA;&#x914D;&#x7F6E;&#x5B50; appender&#x3002;&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;<code>SiftingAppender</code> &#x4F1A;&#x521B;&#x5EFA;&#x591A;&#x4E2A; <code>FileAppender</code> &#x5B9E;&#x4F8B;&#x3002;&#x6BCF;&#x4E2A; <code>FileAppender</code> &#x5B9E;&#x4F8B;&#x901A;&#x8FC7; MDC &#x7684; key &#x6240;&#x5BF9;&#x5E94;&#x7684;&#x503C;&#x6765;&#x6807;&#x8BC6;&#x3002;&#x6BCF;&#x5F53; MDC &#x7684; key &quot;userid&quot; &#x88AB;&#x5206;&#x914D;&#x4E00;&#x4E2A;&#x65B0;&#x503C;&#x65F6;&#xFF0C;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <code>FileAppender</code> &#x5C06;&#x4F1A;&#x88AB;&#x6784;&#x5EFA;&#x3002;<code>SiftingAppender</code> &#x53EF;&#x4EE5;&#x8FFD;&#x8E2A;&#x5B83;&#x6240;&#x521B;&#x5EFA;&#x7684; appender&#x3002;appender &#x5728; 30 &#x5206;&#x949F;&#x4E4B;&#x5185;&#x6CA1;&#x6709;&#x88AB;&#x4F7F;&#x7528;&#x5C06;&#x4F1A;&#x88AB;&#x81EA;&#x52A8;&#x5173;&#x95ED;&#x5E76;&#x4E22;&#x5F03;&#x3002;</p>
<p><code>&#x5BFC;&#x51FA;&#x53D8;&#x91CF;</code> &#x6709;&#x4E0D;&#x540C; appender &#x5B9E;&#x4F8B;&#x662F;&#x4E0D;&#x591F;&#x7684;&#x3002;&#x6BCF;&#x4E00;&#x4E2A;&#x5B9E;&#x4F8B;&#x90FD;&#x5FC5;&#x987B;&#x8F93;&#x51FA;&#x5230;&#x4E00;&#x4E2A;&#x552F;&#x4E00;&#x7684;&#x8D44;&#x6E90;&#x4E2D;&#x3002;&#x4E3A;&#x4E86;&#x505A;&#x5230;&#x8FD9;&#x79CD;&#x533A;&#x5206;&#xFF0C;&#x5728; appender &#x6A21;&#x677F;&#x4E2D;&#xFF0C;key &#x88AB;&#x4F20;&#x9012;&#x7ED9; discriminator&#x3002;&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#x662F; &quot;userid&quot;&#xFF0C;&#x5B83;&#x5C06;&#x88AB;&#x5BFC;&#x51FA;&#x5E76;&#x53D8;&#x6210;&#x4E00;&#x4E2A;<a href="https://github.com/Volong/logback-chinese-manual/blob/master/03%E7%AC%AC%E4%B8%89%E7%AB%A0%EF%BC%9Alogback%20%E7%9A%84%E9%85%8D%E7%BD%AE.md#%E5%8F%98%E9%87%8F%E6%9B%BF%E6%8D%A2" target="_blank">&#x53D8;&#x91CF;</a>&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x8BE5;&#x53D8;&#x91CF;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7ED9;&#x5B9A;&#x7684;&#x5B50; appender &#x6765;&#x533A;&#x5206;&#x5177;&#x4F53;&#x7684;&#x8D44;&#x6E90;&#x3002;</p>
<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x793A;&#x4F8B;&#x4E2D;&#xFF0C;&#x4F7F;&#x7528; &quot;byUserid.xml&quot; &#x6765;&#x8FD0;&#x884C; <code>SiftExample</code>&#xFF0C;&#x5C06;&#x4F1A;&#x521B;&#x5EFA;&#x4E24;&#x4E2A;&#x4E0D;&#x540C;&#x7684;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#xFF0C;&quot;unknown.log&quot; &#x4E0E; &quot;Alice.log&quot;&#x3002;</p>
<p><code>&#x672C;&#x5730;&#x53D8;&#x91CF;</code> &#x5728;&#x7248;&#x672C; 1.0.12 &#x4E2D;&#xFF0C;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x7684;&#x5C5E;&#x6027;&#x4E5F;&#x53EF;&#x4EE5;&#x5E94;&#x7528;&#x5230;&#x5185;&#x7F6E;&#x7684; appender &#x4E2D;&#x3002;&#x800C;&#x4E14;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5728; <code>&lt;sift&gt;</code> &#x5143;&#x7D20;&#x4E2D;<a href="https://github.com/Volong/logback-chinese-manual/blob/master/03%E7%AC%AC%E4%B8%89%E7%AB%A0%EF%BC%9Alogback%20%E7%9A%84%E9%85%8D%E7%BD%AE.md#%E5%8F%98%E9%87%8F%E7%9A%84%E5%AE%9A%E4%B9%89" target="_blank">&#x5B9A;&#x4E49;&#x53D8;&#x91CF;</a>&#x4EE5;&#x53CA;<a href="https://github.com/Volong/logback-chinese-manual/blob/master/03%E7%AC%AC%E4%B8%89%E7%AB%A0%EF%BC%9Alogback%20%E7%9A%84%E9%85%8D%E7%BD%AE.md#%E5%8A%A8%E6%80%81%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7" target="_blank">&#x52A8;&#x6001;&#x5B9A;&#x4E49;&#x5C5E;&#x6027;</a>&#x3002;&#x6216;&#x8005;&#x5728; <code>&lt;sift&gt;</code> &#x5143;&#x7D20;&#x4E4B;&#x5916;&#x5B9A;&#x4E49;&#x53D8;&#x91CF;&#xFF0C;&#x5728;&#x91CC;&#x9762;&#x4F7F;&#x7528;&#x4E5F;&#x662F;&#x652F;&#x6301;&#x7684;&#x3002;</p>
<h4 id="&#x83B7;&#x53D6;&#x6B63;&#x786E;&#x7684;-timeout">&#x83B7;&#x53D6;&#x6B63;&#x786E;&#x7684; <code>timeout</code></h4>
<p>&#x5BF9;&#x4E8E;&#x7279;&#x5B9A;&#x7C7B;&#x578B;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x6B63;&#x786E;&#x7684;&#x83B7;&#x53D6; <code>timeout</code> &#x53C2;&#x6570;&#x975E;&#x5E38;&#x56F0;&#x96BE;&#x3002;&#x5982;&#x679C; <code>timeout</code> &#x8FC7;&#x5C0F;&#xFF0C;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5185;&#x7F6E; appender &#x5728;&#x521B;&#x5EFA;&#x51E0;&#x79D2;&#x949F;&#x4E4B;&#x540E;&#x5C31;&#x88AB;&#x79FB;&#x9664;&#x4E86;&#x3002;&#x8FD9;&#x79CD;&#x73B0;&#x8C61;&#x88AB;&#x79F0;&#x4E3A; &quot;&#x5236;&#x9020;&#x5783;&#x573E;&quot;&#x3002;&#x5982;&#x679C; <code>timeout</code> &#x7684;&#x503C;&#x8FC7;&#x5927;&#xFF0C;&#x90A3;&#x4E48; appender &#x4F1A;&#x5FEB;&#x901F;&#x63A5;&#x8FDE;&#x7684;&#x88AB;&#x521B;&#x5EFA;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x8017;&#x5C3D;&#x8D44;&#x6E90;&#x3002;&#x540C;&#x7406;&#xFF0C;&#x8BBE;&#x7F6E; <code>maxAppenderCount</code> &#x7684;&#x503C;&#x592A;&#x4F4E;&#x4F1A;&#x4EA7;&#x751F;&#x5783;&#x573E;&#x3002;</p>
<p>&#x5728;&#x5927;&#x591A;&#x6570;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x663E;&#x793A;&#x7684;&#x6307;&#x51FA;&#x4E0D;&#x9700;&#x8981;&#x518D;&#x521B;&#x5EFA;&#x5185;&#x7F6E;&#x7684; appender&#x3002;&#x9700;&#x8981;&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x6807;&#x8BB0;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x4E3A; <a href="https://logback.qos.ch/apidocs/ch/qos/logback/classic/ClassicConstants.html#FINALIZE_SESSION_MARKER" target="_blank">FINALIZE_SESSION</a>&#x3002;&#x65E0;&#x8BBA;&#x4EC0;&#x4E48;&#x65F6;&#x5019; SiftingAppender &#x770B;&#x5230;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x6807;&#x8BB0;&#x4E3A; <code>FINALIZE_SESSION</code>&#xFF0C;&#x5B83;&#x5C06;&#x4F1A;&#x7EC8;&#x7ED3;&#x76F8;&#x5173;&#x7684;&#x5B50; appender&#x3002;&#x5728;&#x751F;&#x547D;&#x5468;&#x671F;&#x5FEB;&#x7ED3;&#x675F;&#x65F6;&#xFF0C;&#x5185;&#x7F6E;&#x7684; appender &#x5C06;&#x4F1A;&#x7559;&#x5B58;&#x51E0;&#x79D2;&#x949F;&#x6765;&#x5904;&#x7406;&#x4E4B;&#x540E;&#x5230;&#x6765;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x5173;&#x95ED;&#x3002;</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> org.slf4j.Logger;
<span class="hljs-keyword">import</span> <span class="hljs-keyword">static</span> ch.qos.logback.classic.ClassicConstants.FINALIZE_SESSION_MARKER;

  <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">job</span><span class="hljs-params">(String jobId)</span> </span>{

    MDC.put(<span class="hljs-string">&quot;jobId&quot;</span>, jobId);
    logger.info(<span class="hljs-string">&quot;Starting job.&quot;</span>);

    ... do whather the job needs to do

    <span class="hljs-comment">// &#x5C06;&#x5BFC;&#x81F4;&#x5185;&#x7F6E; appender &#x7ED3;&#x675F;&#x751F;&#x547D;&#x5468;&#x671F;&#x3002;&#x4F46;&#x662F;&#x4F1A;&#x7559;&#x5B58;&#x51E0;&#x79D2;&#x949F;</span>
    logger.info(FINALIZE_SESSION_MARKER, <span class="hljs-string">&quot;About to end the job&quot;</span>);

    <span class="hljs-keyword">try</span> {
      .. perform clean up
    } <span class="hljs-keyword">catch</span>(Exception e);  
      <span class="hljs-comment">// &#x88AB;&#x7559;&#x5B58;&#x7684; appender &#x5904;&#x7406;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x4F1A;&#x518D;&#x521B;&#x5EFA;&#x65B0;&#x7684; appender</span>
      logger.error(<span class="hljs-string">&quot;unexpected error while cleaning up&quot;</span>, e);
    }
  }
</code></pre>
<h3 id="asyncappender">AsyncAppender</h3>
<p>AsyncAppender &#x5F02;&#x6B65;&#x7684;&#x6253;&#x5370; <a href="https://logback.qos.ch/apidocs/ch/qos/logback/classic/spi/ILoggingEvent.html" target="_blank">ILoggingEvent</a>&#x3002;&#x5B83;&#x4EC5;&#x4EC5;&#x662F;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;&#x8C03;&#x5EA6;&#x5668;&#x7684;&#x5B58;&#x5728;&#xFF0C;&#x56E0;&#x6B64;&#x5FC5;&#x987B;&#x8C03;&#x7528;&#x5176;&#x5B83;&#x7684; appender &#x6765;&#x5B8C;&#x6210;&#x64CD;&#x4F5C;&#x3002;</p>
<p><code>&#x9ED8;&#x8BA4;&#x6EE1;&#x4E86; 80% &#x4F1A;&#x4E22;&#x5F03;&#x6570;&#x636E;</code> AsyncAppender &#x4F7F;&#x7528; <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html" target="_blank">BlockingQueue</a> &#x6765;&#x7F13;&#x5B58;&#x65E5;&#x5FD7;&#x65F6;&#x95F4;&#x3002;AsyncAppender &#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x53BB;&#x961F;&#x5217;&#x7684;&#x5934;&#x90E8;&#x83B7;&#x53D6;&#x6570;&#x636E;&#xFF0C;&#x5E76;&#x5C06;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x8C03;&#x5EA6;&#x7ED9;&#x9644;&#x52A0;&#x518D; AsyncAppender &#x4E0A;&#x7684; appender&#x3002;&#x5728;&#x9ED8;&#x8BA4;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5728;&#x961F;&#x5217;&#x88AB;&#x5360;&#x7528;&#x4E86; 80% &#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;AsyncAppender &#x4F1A;&#x4E22;&#x5F03;&#x6389;&#x7EA7;&#x522B;&#x4E3A; TRACE&#xFF0C;DEBUG&#xFF0C;INFO &#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x8FD9;&#x4E2A;&#x7B56;&#x7565;&#x867D;&#x7136;&#x4F1A;&#x4E22;&#x5931;&#x6389;&#x65E5;&#x5FD7;&#xFF0C;&#x4F46;&#x662F;&#x5BF9;&#x6027;&#x80FD;&#x6709;&#x5229;&#x3002;</p>
<p><code>&#x505C;&#x6B62;/&#x91CD;&#x65B0;&#x90E8;&#x7F72;&#x5E94;&#x7528;</code> &#x5F53;&#x505C;&#x6B62;&#x6216;&#x8005;&#x91CD;&#x65B0;&#x90E8;&#x7F72;&#x5E94;&#x7528;&#x65F6;&#xFF0C;<code>AsyncAppender</code> &#x5FC5;&#x987B;&#x88AB;&#x7EC8;&#x6B62;&#xFF0C;&#x4E3A;&#x4E86;&#x505C;&#x6B62;&#x5E76;&#x53EC;&#x56DE;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#xFF0C;&#x4EE5;&#x53CA;&#x5237;&#x65B0;&#x961F;&#x5217;&#x4E2D;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x901A;&#x8FC7;<a href="https://github.com/Volong/logback-chinese-manual/blob/master/03%E7%AC%AC%E4%B8%89%E7%AB%A0%EF%BC%9Alogback%20%E7%9A%84%E9%85%8D%E7%BD%AE.md#%E5%81%9C%E6%AD%A2-logback-classic" target="_blank">&#x7EC8;&#x6B62;&#x4E0A;&#x4E0B;&#x6587;</a>&#x53EF;&#x4EE5;&#x8FBE;&#x5230;&#x8FD9;&#x4E2A;&#x76EE;&#x6807;&#xFF0C;&#x5E76;&#x4F1A;&#x5173;&#x95ED;&#x6240;&#x6709;&#x7684; appender&#xFF0C;&#x5305;&#x542B;&#x6240;&#x6709; <code>AsyncAppender</code> &#x5B9E;&#x4F8B;&#x3002;<code>AsyncAppender</code> &#x5C06;&#x7B49;&#x5F85;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x6307;&#x5B9A;&#x7684; <code>maxFlushTime</code> &#x65F6;&#x95F4;&#x6765;&#x5237;&#x65B0;&#x961F;&#x5217;&#x3002;&#x5982;&#x679C;&#x4F60;&#x53D1;&#x73B0;&#x5728;&#x5173;&#x95ED; <code>LoggerContext</code> &#x671F;&#x95F4;&#xFF0C;&#x961F;&#x5217;&#x4E2D;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x88AB;&#x4E22;&#x5F03;&#x4E86;&#xFF0C;&#x90A3;&#x4E48;&#x4F60;&#x9700;&#x8981;&#x53BB;&#x589E;&#x52A0; <code>maxFlushTime</code>&#x3002;&#x6307;&#x5B9A; <code>maxFlushTime</code> &#x7684;&#x503C;&#x4E3A; 0 &#x5C06;&#x4F1A;&#x5F3A;&#x5236; <code>AsyncAppender</code> &#x7B49;&#x5F85;&#x6240;&#x6709;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x88AB;&#x5237;&#x65B0;&#x624D;&#x4F1A;&#x4ECE; stop() &#x65B9;&#x6CD5;&#x4E2D;&#x8FD4;&#x56DE;&#x3002;</p>
<p><code>&#x505C;&#x6B62;&#x540E;&#x518D;&#x6E05;&#x7406;</code> &#x53D6;&#x51B3;&#x4E8E; JVM &#x7684;&#x505C;&#x6B62;&#x6A21;&#x5F0F;&#xFF0C;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x5728;&#x5904;&#x7406;&#x961F;&#x5217;&#x4E2D;&#x7684;&#x4E8B;&#x4EF6;&#x65F6;&#x88AB;&#x6253;&#x65AD;&#x4F1A;&#x5BFC;&#x81F4;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5728;&#x961F;&#x5217;&#x4E2D;&#x88AB;&#x963B;&#x585E;&#x3002;&#x4E00;&#x822C;&#x53D1;&#x751F;&#x5728; <code>LoggerContext</code> &#x6CA1;&#x6709;&#x88AB;&#x5B8C;&#x5168;&#x505C;&#x6B62;&#xFF0C;&#x6216;&#x8005; JVM &#x5728;&#x5178;&#x578B;&#x63A7;&#x5236;&#x6D41;&#x4E4B;&#x5916;&#x7EC8;&#x6B62;&#x3002;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x5DE5;&#x4F5C;&#x961F;&#x5217;&#x5728;&#x8FD9;&#x4E9B;&#x60C5;&#x51B5;&#x4E0B;&#x88AB;&#x6253;&#x65AD;&#x3002;&#x5C06;&#x4E00;&#x4E2A; shutdown hook &#x5728; JVM &#x8FD0;&#x884C;&#x65F6;&#x63D2;&#x5165;&#xFF0C;&#x5728; JVM &#x5F00;&#x59CB;&#x51C6;&#x5907;&#x505C;&#x6B62;&#x7684;&#x65F6;&#x5019;&#x53EF;&#x4EE5;<a href="https://github.com/Volong/logback-chinese-manual/blob/master/03%E7%AC%AC%E4%B8%89%E7%AB%A0%EF%BC%9Alogback%20%E7%9A%84%E9%85%8D%E7%BD%AE.md#%E5%81%9C%E6%AD%A2-logback-classic" target="_blank">&#x6B63;&#x786E;&#x7684;&#x5173;&#x95ED; LoggerContext</a>&#x3002;&#x5F53;&#x5176;&#x5B83;&#x7684; shutdown hook &#x5C1D;&#x8BD5;&#x8BB0;&#x5F55;&#x4E8B;&#x4EF6;&#x65F6;&#xFF0C;shutdown hook &#x53EF;&#x4EE5;&#x4F5C;&#x4E3A;&#x9996;&#x9009;&#x7684;&#x65B9;&#x6CD5;&#x6765;&#x5B8C;&#x5168;&#x5173;&#x95ED; logback&#x3002;</p>
<blockquote>
<p>  &#x6700;&#x540E;&#x4E00;&#x53E5;&#x8BDD;&#x6CA1;&#x6709;&#x641E;&#x61C2;&#x662F;&#x4EC0;&#x4E48;&#x610F;&#x601D;</p>
</blockquote>
<p>&#x5982;&#x4E0B;&#x662F; AsyncAppender &#x7684;&#x4E00;&#x4E9B;&#x5C5E;&#x6027;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x5C5E;&#x6027;&#x540D;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td>queueSize</td>
<td><code>int</code></td>
<td>&#x961F;&#x5217;&#x7684;&#x6700;&#x5927;&#x5BB9;&#x91CF;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A; 256</td>
</tr>
<tr>
<td>discardingThreshold</td>
<td><code>int</code></td>
<td>&#x9ED8;&#x8BA4;&#xFF0C;&#x5F53;&#x961F;&#x5217;&#x8FD8;&#x5269;&#x4F59; 20% &#x7684;&#x5BB9;&#x91CF;&#x65F6;&#xFF0C;&#x4F1A;&#x4E22;&#x5F03;&#x7EA7;&#x522B;&#x4E3A; TRACE, DEBUG &#x4E0E; INFO &#x7684;&#x65E5;&#x5FD7;&#xFF0C;&#x4EC5;&#x4EC5;&#x53EA;&#x4FDD;&#x7559; WARN &#x4E0E; ERROR &#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;&#x3002;&#x60F3;&#x8981;&#x4FDD;&#x7559;&#x6240;&#x6709;&#x7684;&#x4E8B;&#x4EF6;&#xFF0C;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x4E3A; 0</td>
</tr>
<tr>
<td>includeCallerData</td>
<td><code>boolean</code></td>
<td>&#x83B7;&#x53D6;&#x8C03;&#x7528;&#x8005;&#x7684;&#x6570;&#x636E;&#x76F8;&#x5BF9;&#x6765;&#x8BF4;&#x6BD4;&#x8F83;&#x6602;&#x8D35;&#x3002;&#x4E3A;&#x4E86;&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#xFF0C;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#x4E0D;&#x4F1A;&#x83B7;&#x53D6;&#x8C03;&#x7528;&#x8005;&#x7684;&#x4FE1;&#x606F;&#x3002;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x53EA;&#x6709;&#x50CF;&#x7EBF;&#x7A0B;&#x540D;&#x6216;&#x8005; <a href="https://logback.qos.ch/manual/mdc.html" target="_blank">MDC</a> &#x8FD9;&#x79CD;&quot;&#x4FBF;&#x5B9C;&quot;&#x7684;&#x6570;&#x636E;&#x4F1A;&#x88AB;&#x590D;&#x5236;&#x3002;&#x8BBE;&#x7F6E;&#x4E3A; true &#x65F6;&#xFF0C;appender &#x4F1A;&#x5305;&#x542B;&#x8C03;&#x7528;&#x8005;&#x7684;&#x4FE1;&#x606F;</td>
</tr>
<tr>
<td>maxFlushTime</td>
<td><code>int</code></td>
<td>&#x6839;&#x636E;&#x6240;&#x5F15;&#x7528; appender &#x961F;&#x5217;&#x7684;&#x6DF1;&#x5EA6;&#x4EE5;&#x53CA;&#x5EF6;&#x8FDF;&#xFF0C; <code>AsyncAppender</code> &#x53EF;&#x80FD;&#x4F1A;&#x8017;&#x8D39;&#x957F;&#x65F6;&#x95F4;&#x53BB;&#x5237;&#x65B0;&#x961F;&#x5217;&#x3002;&#x5F53; <code>LoggerContext</code> &#x88AB;&#x505C;&#x6B62;&#x65F6;&#xFF0C; <code>AsyncAppender stop</code> &#x65B9;&#x6CD5;&#x4F1A;&#x7B49;&#x5F85;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x6307;&#x5B9A;&#x7684;&#x65F6;&#x95F4;&#x6765;&#x5B8C;&#x6210;&#x3002;&#x4F7F;&#x7528; maxFlushTime &#x6765;&#x6307;&#x5B9A;&#x6700;&#x5927;&#x7684;&#x5237;&#x65B0;&#x65F6;&#x95F4;&#xFF0C;&#x5355;&#x4F4D;&#x4E3A;&#x6BEB;&#x79D2;&#x3002;&#x5728;&#x6307;&#x5B9A;&#x65F6;&#x95F4;&#x5185;&#x6CA1;&#x6709;&#x88AB;&#x5904;&#x7406;&#x5B8C;&#x7684;&#x4E8B;&#x4EF6;&#x5C06;&#x4F1A;&#x88AB;&#x4E22;&#x5F03;&#x3002;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x7684;&#x503C;&#x7684;&#x542B;&#x4E49;&#x4E0E;  <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join(long" target="_blank">Thread.join(long)</a>) &#x76F8;&#x540C;</td>
</tr>
<tr>
<td>neverBlock</td>
<td><code>boolean</code></td>
<td>&#x9ED8;&#x8BA4;&#x4E3A; false&#xFF0C;&#x5728;&#x961F;&#x5217;&#x6EE1;&#x7684;&#x65F6;&#x5019; appender &#x4F1A;&#x963B;&#x585E;&#x800C;&#x4E0D;&#x662F;&#x4E22;&#x5F03;&#x4FE1;&#x606F;&#x3002;&#x8BBE;&#x7F6E;&#x4E3A; true&#xFF0C;appender &#x4E0D;&#x4F1A;&#x963B;&#x585E;&#x4F60;&#x7684;&#x5E94;&#x7528;&#x800C;&#x4F1A;&#x5C06;&#x6D88;&#x606F;&#x4E22;&#x5F03;</td>
</tr>
</tbody>
</table>
<p>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x7684;&#x6700;&#x5927; &#x5BB9;&#x91CF;&#x4E3A; 256&#x3002;&#x5982;&#x679C;&#x961F;&#x5217;&#x88AB;&#x586B;&#x6EE1;&#xFF0C;&#x90A3;&#x4E48;&#x65B0;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5C06;&#x88AB;&#x963B;&#x585E;&#xFF0C;&#x76F4;&#x5230;&#x5DE5;&#x4F5C;&#x7EBF;&#x7A0B;&#x6709;&#x673A;&#x4F1A;&#x53BB;&#x8C03;&#x5EA6;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;&#x5F53;&#x961F;&#x5217;&#x7684;&#x5BB9;&#x91CF;&#x6CA1;&#x6709;&#x5904;&#x5728;&#x6700;&#x5927;&#x5BB9;&#x91CF;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5E94;&#x7528;&#x7EBF;&#x7A0B;&#x80FD;&#x591F;&#x518D;&#x6B21;&#x5F00;&#x59CB;&#x8BB0;&#x5F55;&#x65E5;&#x5FD7;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x5728; AsyncAppender &#x5728;&#x7F13;&#x51B2;&#x533A;&#x7684;&#x5BB9;&#x91CF;&#x6EE1;&#x4E86;&#x6216;&#x8005;&#x5FEB;&#x6EE1;&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5F02;&#x6B65;&#x65E5;&#x5FD7;&#x8BB0;&#x5F55;&#x53D8;&#x6210;&#x4E86;&#x4F2A;&#x5F02;&#x6B65;&#x3002;&#x4F46;&#x8FD9;&#x4E5F;&#x4E0D;&#x662F;&#x4EC0;&#x4E48;&#x574F;&#x7684;&#x4E8B;&#x3002;&#x867D;&#x7136;&#x5728; appender &#x7F13;&#x51B2;&#x533A;&#x7684;&#x538B;&#x529B;&#x51CF;&#x5C11;&#x4E4B;&#x524D;&#xFF0C;&#x4F1A;&#x7A0D;&#x5FAE;&#x82B1;&#x70B9;&#x65F6;&#x95F4;&#x53BB;&#x5904;&#x7406;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x4E2A;&#x8BBE;&#x8BA1;&#x53EF;&#x4EE5;&#x8BA9;&#x5E94;&#x7528;&#x7EE7;&#x7EED;&#x4FDD;&#x6301;&#x8FD0;&#x884C;&#x3002;</p>
<p>&#x4E3A;&#x5E94;&#x7528;&#x7684;&#x6700;&#x5927;&#x541E;&#x5410;&#x91CF;&#x4F18;&#x5316; appender &#x7684;&#x4E8B;&#x4EF6;&#x961F;&#x5217;&#x4F9D;&#x8D56;&#x4EE5;&#x4E0B;&#x51E0;&#x4E2A;&#x56E0;&#x7D20;&#x3002;&#x4EE5;&#x4E0B;&#x7684;&#x4EFB;&#x4F55;&#x4E00;&#x4E2A;&#x56E0;&#x7D20;&#x90FD;&#x6709;&#x53EF;&#x80FD;&#x5BFC;&#x81F4;&#x4F2A;&#x540C;&#x6B65;&#x7684;&#x53D1;&#x751F;&#xFF1A;</p>
<ul>
<li>&#x5927;&#x91CF;&#x7684;&#x5E94;&#x7528;&#x7EBF;&#x7A0B;</li>
<li>&#x6BCF;&#x4E2A;&#x5E94;&#x7528;&#x8C03;&#x7528;&#x5927;&#x91CF;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;</li>
<li>&#x6BCF;&#x4E2A;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x6709;&#x5927;&#x91CF;&#x7684;&#x6570;&#x636E;</li>
<li>&#x9AD8;&#x5EF6;&#x8FDF;&#x7684;&#x5B50; appender</li>
</ul>
<p>&#x4E3A;&#x4E86;&#x4FDD;&#x6301;&#x4E8B;&#x7269;&#x7EE7;&#x7EED;&#x4E0B;&#x53BB;&#xFF0C;&#x589E;&#x52A0;&#x961F;&#x5217;&#x7684;&#x5927;&#x5C0F;&#x901A;&#x5E38;&#x6709;&#x7528;&#xFF0C;&#x4F46;&#x662F;&#x662F;&#x4EE5;&#x5E94;&#x7528;&#x53EF;&#x7528;&#x7684;&#x5806;&#x4E3A;&#x4EE3;&#x4EF7;&#x3002;</p>
<p><code>&#x4E22;&#x5F03;&#x884C;&#x4E3A;</code> &#x6839;&#x636E;&#x4E4B;&#x524D;&#x7684;&#x8BA8;&#x8BBA;&#xFF0C;&#x4E3A;&#x4E86;&#x51CF;&#x5C11;&#x963B;&#x585E;&#x3002;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x5F53;&#x5269;&#x4F59;&#x5BB9;&#x91CF;&#x5C11;&#x4E8E; 20% &#x7684;&#x65F6;&#x5019;&#xFF0C;<code>AsyncAppender</code> &#x4F1A;&#x4E22;&#x6389; TRACE, DEBUG &#x4EE5;&#x53CA; INFO &#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;&#xFF0C;&#x4FDD;&#x7559; WARN &#x4E0E; ERROR &#x7EA7;&#x522B;&#x7684;&#x65E5;&#x5FD7;&#x3002;&#x8BE5;&#x7B56;&#x7565;&#x53EF;&#x4EE5;&#x786E;&#x4FDD;&#x975E;&#x963B;&#x585E;&#x7684;&#x5904;&#x7406;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6; (&#x56E0;&#x6B64;&#x5177;&#x6709;&#x9AD8;&#x6027;&#x80FD;)&#x3002;&#x901A;&#x8FC7;&#x8BBE;&#x7F6E; <code>discardingThreshold</code> &#x7684;&#x503C;&#x4E3A; 0 &#x53EF;&#x4EE5;&#x963B;&#x6B62;&#x4E22;&#x5F03;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;</p>
<blockquote>
<p>Example: logback-async.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;FILE&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.FileAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>myapp.log<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">encoder</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%logger{35} - %msg%n<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">encoder</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;ASYNC&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.classic.AsyncAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;FILE&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">root</span> <span class="hljs-attr">level</span>=<span class="hljs-string">&quot;DEBUG&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;ASYNC&quot;</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">root</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h3 id="&#x7F16;&#x5199;&#x4F60;&#x81EA;&#x5DF1;&#x7684;-appender">&#x7F16;&#x5199;&#x4F60;&#x81EA;&#x5DF1;&#x7684; Appender</h3>
<p>&#x901A;&#x8FC7;&#x7EE7;&#x627F; AppenderBase &#x53EF;&#x4EE5;&#x7F16;&#x5199;&#x4F60;&#x81EA;&#x5DF1;&#x7684; appender&#x3002;&#x5B83;&#x652F;&#x6301;&#x5904;&#x7406;&#x8FC7;&#x6EE4;&#x5668;&#xFF0C;&#x72B6;&#x6001;&#x4FE1;&#x606F;&#xFF0C;&#x4EE5;&#x53CA;&#x5176;&#x5B83;&#x5927;&#x591A;&#x6570; appender &#x5171;&#x4EAB;&#x7684;&#x529F;&#x80FD;&#x3002;&#x5B50;&#x7C7B;&#x4EC5;&#x4EC5;&#x53EA;&#x9700;&#x8981;&#x5B9E;&#x73B0; <code>append(Object eventObject)</code> &#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x63A5;&#x4E0B;&#x6765;&#x5217;&#x51FA;&#x6765;&#x7684; <code>CountingConsoleAppender</code>&#xFF0C;&#x9650;&#x5236;&#x4E86;&#x8F93;&#x51FA;&#x5230;&#x63A7;&#x5236;&#x53F0;&#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x6570;&#x91CF;&#x3002;&#x5F53;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x7684;&#x6570;&#x91CF;&#x8FBE;&#x5230;&#x4E0A;&#x9650;&#x65F6;&#xFF0C;&#x5B83;&#x4F1A;&#x9000;&#x51FA;&#x3002;&#x5B83;&#x4F7F;&#x7528; <code>PatternLayoutEncoder</code> &#x6765;&#x683C;&#x5F0F;&#x5316;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x63A5;&#x6536;&#x4E00;&#x4E2A; <code>limit</code> &#x7684;&#x53C2;&#x6570;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x9664;&#x4E86; <code>append(Object eventObject)</code> &#x65B9;&#x6CD5;&#x4E4B;&#x540E;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x4E00;&#x4E9B;&#x5176;&#x5B83;&#x7684;&#x65B9;&#x6CD5;&#x3002;&#x6B63;&#x5982;&#x4E0B;&#x9762;&#x5C55;&#x793A;&#x7684;&#xFF0C;&#x8FD9;&#x4E9B;&#x53C2;&#x6570;&#x90FD;&#x662F;&#x901A;&#x8FC7; logback &#x591A;&#x79CD;&#x914D;&#x7F6E;&#x673A;&#x5236;&#x6765;&#x81EA;&#x52A8;&#x5904;&#x7406;&#x7684;&#x3002;</p>
<blockquote>
<p>Example: <em>CountingConsoleAppender.java</em> </p>
</blockquote>
<pre><code class="lang-java"><span class="hljs-keyword">package</span> chapters.appenders;

<span class="hljs-keyword">import</span> java.io.IOException;

<span class="hljs-keyword">import</span> ch.qos.logback.classic.encoder.PatternLayoutEncoder;
<span class="hljs-keyword">import</span> ch.qos.logback.classic.spi.ILoggingEvent;
<span class="hljs-keyword">import</span> ch.qos.logback.core.AppenderBase;


<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CountingConsoleAppender</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AppenderBase</span>&lt;<span class="hljs-title">ILoggingEvent</span>&gt; </span>{
  <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> DEFAULT_LIMIT = <span class="hljs-number">10</span>;
  <span class="hljs-keyword">int</span> counter = <span class="hljs-number">0</span>;
  <span class="hljs-keyword">int</span> limit = DEFAULT_LIMIT;

  PatternLayoutEncoder encoder;

  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setLimit</span><span class="hljs-params">(<span class="hljs-keyword">int</span> limit)</span> </span>{
    <span class="hljs-keyword">this</span>.limit = limit;
  }

  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getLimit</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> limit;
  }

  <span class="hljs-meta">@Override</span>
  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">start</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.encoder == <span class="hljs-keyword">null</span>) {
      addError(<span class="hljs-string">&quot;No encoder set for the appender named [&quot;</span>+ name +<span class="hljs-string">&quot;].&quot;</span>);
      <span class="hljs-keyword">return</span>;
    }

    <span class="hljs-keyword">try</span> {
      encoder.init(System.out);
    } <span class="hljs-keyword">catch</span> (IOException e) {
    }
    <span class="hljs-keyword">super</span>.start();
  }

  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">append</span><span class="hljs-params">(ILoggingEvent event)</span> </span>{
    <span class="hljs-keyword">if</span> (counter &gt;= limit) {
      <span class="hljs-keyword">return</span>;
    }
    <span class="hljs-comment">// &#x901A;&#x8FC7;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x7684; layout &#x6765;&#x683C;&#x5F0F;&#x5316;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;</span>
    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">this</span>.encoder.doEncode(event);
    } <span class="hljs-keyword">catch</span> (IOException e) {
    }

    <span class="hljs-comment">// &#x51C6;&#x5907;&#x4E0B;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;</span>
    counter++;
  }

  <span class="hljs-function"><span class="hljs-keyword">public</span> PatternLayoutEncoder <span class="hljs-title">getEncoder</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> encoder;
  }

  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setEncoder</span><span class="hljs-params">(PatternLayoutEncoder encoder)</span> </span>{
    <span class="hljs-keyword">this</span>.encoder = encoder;
  }
}
</code></pre>
<p><code>start()</code> &#x65B9;&#x6CD5;&#x4F1A;&#x68C0;&#x67E5;&#x662F;&#x5426;&#x6709; <code>PatternLayoutEncoder</code> &#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;appender &#x5C06;&#x4F1A;&#x542F;&#x52A8;&#x5931;&#x8D25;&#x5E76;&#x4F1A;&#x53D1;&#x51FA;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x5B9A;&#x5236;&#x7684; appender &#x8BF4;&#x660E;&#x4E86;&#x4E24;&#x70B9;&#xFF1A;</p>
<ul>
<li>&#x6240;&#x6709;&#x7684;&#x5C5E;&#x6027;&#x9075;&#x5FAA; JavaBean &#x7684; setter/getter &#x8F6C;&#x6362;&#xFF0C;&#x7531; logback &#x900F;&#x660E;&#x7684;&#x5904;&#x7406;&#x3002;&#x5728; logback &#x914D;&#x7F6E;&#x671F;&#x95F4;&#xFF0C;<code>start()</code> &#x65B9;&#x6CD5;&#x4F1A;&#x88AB;&#x81EA;&#x52A8;&#x8C03;&#x7528;&#xFF0C;&#x7528;&#x6765;&#x9A8C;&#x8BC1; appender &#x7684;&#x5404;&#x79CD;&#x5C5E;&#x6027;&#x662F;&#x5426;&#x8BBE;&#x7F6E;&#x4E0E;&#x4E00;&#x81F4;</li>
<li><code>AppenderBase.doAppend()</code> &#x65B9;&#x6CD5;&#x4F1A;&#x8C03;&#x7528;&#x5B83;&#x5B50;&#x7C7B;&#x7684;&#x6240;&#x6709; append() &#x65B9;&#x6CD5;&#x3002;&#x5B9E;&#x9645;&#x4E0A;&#x8F93;&#x51FA;&#x64CD;&#x4F5C;&#x53D1;&#x751F;&#x5728; <code>append()</code> &#x65B9;&#x6CD5;&#x4E2D;&#x3002;&#x800C;&#x4E14;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x4E2D;&#xFF0C;appender &#x901A;&#x8FC7;&#x8C03;&#x7528;&#x5B83;&#x4EEC;&#x7684; layout &#x6765;&#x683C;&#x5F0F;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x3002;</li>
</ul>
<p><a href="https://logback.qos.ch/xref/chapters/appenders/CountingConsoleAppender.html" target="_blank"><code>CountingConsoleAppender</code></a> &#x53EF;&#x4EE5;&#x50CF;&#x5176;&#x5B83;&#x7684; appender &#x4E00;&#x6837;&#x914D;&#x7F6E;&#x3002;&#x8BE6;&#x60C5;&#x89C1; <em>countingConsole.xml</em>&#x3002;</p>
<h2 id="logback-access">Logback Access</h2>
<p>&#x5927;&#x90E8;&#x5206;&#x7684; appender &#x90FD;&#x53EF;&#x4EE5;&#x5728; logback-classic &#x4E2D;&#x627E;&#x5230;&#xFF0C;&#x540C;&#x6837;&#x7684;&#x5728; logback-access &#x4E2D;&#x4E5F;&#x53EF;&#x4EE5;&#x627E;&#x5230;&#x3002;&#x5B83;&#x4EEC;&#x7684;&#x5DE5;&#x4F5C;&#x672C;&#x8D28;&#x4E0A;&#x4E0E;&#x5728; logback-classic &#x4E2D;&#x8868;&#x73B0;&#x7684;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;&#x5728;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x8BA8;&#x8BBA;&#x5B83;&#x4EEC;&#x7684;&#x7528;&#x6CD5;&#x3002;</p>
<h3 id="socketappender-&#x4E0E;-sslsocketappender">SocketAppender &#x4E0E; SSLSocketAppender</h3>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/access/net/SocketAppender.html" target="_blank"><code>SocketAppender</code></a> &#x88AB;&#x59D4;&#x6258;&#x5C06;&#x5E8F;&#x5217;&#x5316;&#x7684; <code>AccessEvent</code> &#x5BF9;&#x8C61;&#x8BB0;&#x5F55;&#x5230;&#x8FDC;&#x7A0B;&#x5B9E;&#x4F53;&#x4E0A;&#x53BB;&#x3002;&#x8FDC;&#x7A0B;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5BF9; access event &#x6765;&#x8BF4;&#x662F;&#x975E;&#x4FB5;&#x5165;&#x5F0F;&#x7684;&#x3002;&#x5728;&#x63A5;&#x6536;&#x5230;&#x5E76;&#x5E8F;&#x5217;&#x5316;&#x4E4B;&#x540E;&#xFF0C;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5C31;&#x50CF;&#x5728;&#x672C;&#x5730;&#x88AB;&#x751F;&#x6210;&#x4E00;&#x6837;&#x3002;</p>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/access/net/SSLSocketAppender.html" target="_blank"><code>SSLSocketAppender</code></a> &#x6269;&#x5C55;&#x4E86; <code>SocketAppender</code>&#xFF0C;&#x901A;&#x8FC7; SSL &#x4F20;&#x8F93;&#x65E5;&#x5FD7;&#x5230;&#x8FDC;&#x7A0B;&#x5B9E;&#x4F53;&#x4E0A;&#x3002;</p>
<p>access &#x7684; <code>SocketAppender</code> &#x5C5E;&#x6027;&#x8DDF; classic &#x4E2D;&#x7684; <code>SocketAppender</code> &#x5C5E;&#x6027;&#x4E00;&#x6837;&#x3002;</p>
<h3 id="serversocketappender-&#x4E0E;-sslserversocketappender">ServerSocketAppender &#x4E0E; SSLServerSocketAppender</h3>
<p>&#x8DDF; <code>SocketAppender</code> &#x4E00;&#x6837;&#xFF0C;<a href="https://logback.qos.ch/xref/ch/qos/logback/access/net/server/ServerSocketAppender.html" target="_blank"><code>ServerSocketAppender</code></a> &#x88AB;&#x59D4;&#x6258;&#x4F20;&#x8F93;&#x5E8F;&#x5217;&#x5316;&#x540E;&#x7684; <code>AccessEvent</code> &#x5BF9;&#x8C61;&#x5230;&#x8FDC;&#x7A0B;&#x5B9E;&#x4F53;&#x4E0A;&#x3002;&#x4F46;&#x662F;&#xFF0C;&#x4F7F;&#x7528; <code>ServerSocketAppender</code> &#x65F6;&#xFF0C;appender &#x5145;&#x5F53;&#x4E00;&#x4E2A;&#x670D;&#x52A1;&#x5668;&#x7684;&#x89D2;&#x8272;&#xFF0C;&#x88AB;&#x52A8;&#x7684;&#x76D1;&#x542C; TCP &#x7AEF;&#x53E3;&#xFF0C;&#x7B49;&#x5F85;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x8FDE;&#x63A5;&#x3002;&#x4F20;&#x9001;&#x5230; appender &#x7684;&#x65E5;&#x5FD7;&#x4E8B;&#x4EF6;&#x5C06;&#x88AB;&#x5206;&#x53D1;&#x7ED9;&#x6240;&#x6709;&#x8FDE;&#x63A5;&#x7684;&#x5BA2;&#x6237;&#x7AEF;&#x3002;</p>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/access/net/server/SSLServerSocketAppender.html" target="_blank"><code>SSLServerSocketAppender</code></a> &#x62D3;&#x5C55;&#x4E86; <code>ServerSocketAppender</code>&#xFF0C;&#x901A;&#x8FC7; SSL &#x4F20;&#x8F93;&#x65E5;&#x5FD7;&#x5230;&#x8FDC;&#x7A0B;&#x5B9E;&#x4F53;&#x4E0A;&#x3002;</p>
<p>access &#x7684; <code>ServerSocketAppender</code> &#x5C5E;&#x6027;&#x8DDF; classic &#x4E2D;&#x7684; <code>ServerSocketAppender</code> &#x5C5E;&#x6027;&#x4E00;&#x6837;&#x3002;</p>
<h3 id="smtpappender">SMTPAppender</h3>
<p>access &#x4E2D;&#x7684; <a href="https://logback.qos.ch/xref/ch/qos/logback/access/net/SMTPAppender.html" target="_blank"><code>SMTPAppender</code></a> &#x5DE5;&#x4F5C;&#x7684;&#x673A;&#x5236;&#x8DDF; classic &#x4E2D;&#x7684;&#x4E00;&#x6837;&#x3002;&#x4F46;&#x662F; <code>evaluator</code> &#x5C5E;&#x6027;&#x5B8C;&#x5168;&#x4E0D;&#x540C;&#x3002;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;<code>SMTPAppender</code> &#x4F7F;&#x7528;&#x4E00;&#x4E2A; <code>URLEvaluator</code> &#x5BF9;&#x8C61;&#x3002;&#x8FD9;&#x4E2A; evaluator &#x5305;&#x542B;&#x4E86;&#x4E00;&#x4E2A; url &#x5217;&#x8868;&#xFF0C;&#x7528;&#x6765;&#x68C0;&#x67E5;&#x5F53;&#x524D;&#x8BF7;&#x6C42;&#x7684; url&#x3002;&#x5F53;&#x5176;&#x4E2D;&#x4E00;&#x4E2A;&#x9875;&#x9762;&#x7ED9; <code>URLEvaluator</code> &#x8FDB;&#x884C;&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;<code>SMTPAppender</code> &#x4F1A;&#x53D1;&#x9001;&#x4E00;&#x5C01;&#x90AE;&#x4EF6;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x662F;&#x5728; access &#x73AF;&#x5883;&#x4E0B;&#x7684;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1A;</p>
<blockquote>
<p>Example: logback-smtp.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;SMTP&quot;</span>
  <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.access.net.SMTPAppender&quot;</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.access.html.HTMLLayout&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%h%l%u%t%r%s%b<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">layout</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">Evaluator</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.access.net.URLEvaluator&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">URL</span>&gt;</span>url1.jsp<span class="hljs-tag">&lt;/<span class="hljs-name">URL</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">URL</span>&gt;</span>directory/url2.html<span class="hljs-tag">&lt;/<span class="hljs-name">URL</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">Evaluator</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">from</span>&gt;</span>sender_email@host.com<span class="hljs-tag">&lt;/<span class="hljs-name">from</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">smtpHost</span>&gt;</span>mail.domain.com<span class="hljs-tag">&lt;/<span class="hljs-name">smtpHost</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">to</span>&gt;</span>recipient_email@host.com<span class="hljs-tag">&lt;/<span class="hljs-name">to</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>
</code></pre>
<p>&#x5728;&#x67D0;&#x4E9B;&#x7279;&#x5B9A;&#x7684;&#x6D41;&#x7A0B;&#x4E2D;&#xFF0C;&#x7528;&#x6237;&#x9009;&#x62E9;&#x7684;&#x9875;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x91CD;&#x8981;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;&#x90A3;&#x4E48;&#x5C06;&#x4F1A;&#x89E6;&#x53D1;&#x90AE;&#x4EF6;&#x7684;&#x53D1;&#x9001;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x5F53;&#x4E00;&#x4E2A;&#x8FD9;&#x6837;&#x7684;&#x9875;&#x9762;&#x88AB;&#x8BBF;&#x95EE;&#x65F6;&#xFF0C;&#x4E4B;&#x524D;&#x88AB;&#x8BBF;&#x95EE;&#x8FC7;&#x7684;&#x9875;&#x9762;&#x4F1A;&#x5305;&#x542B;&#x5728;&#x90AE;&#x4EF6;&#x4E2D;&#x88AB;&#x53D1;&#x9001;&#xFF0C;&#x8FD8;&#x4F1A;&#x5305;&#x542B;&#x4EFB;&#x4F55;&#x7528;&#x6237;&#x60F3;&#x8981;&#x7684;&#x4FE1;&#x606F;&#x3002;</p>
<h3 id="dbappender">DBAppender</h3>
<p><a href="https://logback.qos.ch/xref/ch/qos/logback/access/db/DBAppender.html" target="_blank"><code>DBAppender</code></a> &#x7528;&#x6765;&#x5C06; access &#x4E8B;&#x4EF6;&#x63D2;&#x5165;&#x5230;&#x6570;&#x636E;&#x5E93;&#x3002;</p>
<p><code>DBAppender</code> &#x7528;&#x5230;&#x4E24;&#x5F20;&#x8868;&#xFF1A;<em>access_event</em> &#x4EE5;&#x53CA; <em>access_event_header</em>&#x3002;&#x5728;&#x4F7F;&#x7528; <code>DBAppender</code> &#x4E4B;&#x524D;&#xFF0C;&#x5B83;&#x4EEC;&#x5FC5;&#x987B;&#x5B58;&#x5728;&#x3002;logback &#x5185;&#x7F6E;&#x4E86; SQL &#x811A;&#x672C;&#x7528;&#x6765;&#x521B;&#x5EFA;&#x8868;&#x683C;&#x3002;&#x5B83;&#x4EEC;&#x5728; <em>logback-access/src/main/java/ch/qos/logback/access/db/script</em> &#x6587;&#x4EF6;&#x5939;&#x4E2D;&#x3002;&#x5927;&#x90E8;&#x5206;&#x6D41;&#x884C;&#x7684;&#x6570;&#x636E;&#x5E93;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x5BF9;&#x5E94;&#x7684;&#x811A;&#x672C;&#x3002;&#x5982;&#x679C;&#x4F60;&#x4F7F;&#x7528;&#x7684;&#x6570;&#x636E;&#x5E93;&#x4E0D;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x8FD9;&#x6837;&#x7684;&#x811A;&#x672C;&#xFF0C;&#x90A3;&#x4E48;&#x4F60;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#x4F8B;&#x5B50;&#xFF0C;&#x5F88;&#x8F7B;&#x6613;&#x7684;&#x5C31;&#x53EF;&#x4EE5;&#x5199;&#x4E00;&#x4E2A;&#x3002;&#x6211;&#x4EEC;&#x9F13;&#x52B1;&#x4F60;&#x5C06;&#x4E00;&#x4E2A;&#x8FD9;&#x6837;&#x7684;&#x811A;&#x672C;&#x63D0;&#x4EA4;&#x5230;&#x8FD9;&#x4E2A;&#x9879;&#x76EE;&#x4E2D;&#x3002;</p>
<p>&#x8868; <em>access_event</em> &#x5305;&#x542B;&#x7684;&#x5B57;&#x6BB5;&#x5982;&#x4E0B;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x5B57;&#x6BB5;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>timestamp</strong></td>
<td><code>big int</code></td>
<td>access &#x65F6;&#x95F4;&#x521B;&#x5EFA;&#x7684;&#x65F6;&#x95F4;</td>
</tr>
<tr>
<td><strong>requestURI</strong></td>
<td><code>varchar</code></td>
<td>&#x8BF7;&#x6C42;&#x7684; URI</td>
</tr>
<tr>
<td><strong>requestURL</strong></td>
<td><code>varchar</code></td>
<td>&#x8BF7;&#x6C42;&#x7684; URL&#x3002;&#x7531;&#x8BF7;&#x6C42;&#x65B9;&#x6CD5;&#xFF0C;&#x8BF7;&#x6C42; URI &#x4EE5;&#x53CA;&#x8BF7;&#x6C42;&#x534F;&#x8BAE;&#x7EC4;&#x6210;</td>
</tr>
<tr>
<td><strong>remoteHost</strong></td>
<td><code>varchar</code></td>
<td>&#x8FDC;&#x7A0B;&#x4E3B;&#x673A;&#x7684;&#x540D;&#x5B57;</td>
</tr>
<tr>
<td><strong>remoteUser</strong></td>
<td><code>varchar</code></td>
<td>&#x8FDC;&#x7A0B;&#x7528;&#x6237;&#x7684;&#x540D;&#x5B57;</td>
</tr>
<tr>
<td><strong>remoteAddr</strong></td>
<td><code>varchar</code></td>
<td>&#x8FDC;&#x7A0B; IP &#x5730;&#x5740;</td>
</tr>
<tr>
<td><strong>protocol</strong></td>
<td><code>varchar</code></td>
<td>&#x8BF7;&#x6C42;&#x534F;&#x8BAE;&#x3002;&#x4F8B;&#x5982; <em>HTTP</em> &#x6216; <em>HTTPS</em></td>
</tr>
<tr>
<td><strong>method</strong></td>
<td><code>varchar</code></td>
<td>&#x8BF7;&#x6C42;&#x65B9;&#x6CD5;&#x3002;&#x901A;&#x5E38;&#x4E3A; <em>GET</em> &#x6216; <em>POST</em></td>
</tr>
<tr>
<td><strong>serverName</strong></td>
<td><code>varchar</code></td>
<td>&#x53D1;&#x51FA;&#x8BF7;&#x6C42;&#x7684;&#x670D;&#x52A1;&#x5668;&#x7684;&#x540D;&#x5B57;</td>
</tr>
<tr>
<td><strong>event_id</strong></td>
<td><code>int</code></td>
<td>access &#x4E8B;&#x4EF6;&#x7684;&#x6570;&#x636E;&#x5E93; id</td>
</tr>
</tbody>
</table>
<p>&#x8868; <em>access_event_header</em> &#x5305;&#x542B;&#x4E86;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x5934;&#x3002;&#x5B57;&#x6BB5;&#x5982;&#x4E0B;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x5B57;&#x6BB5;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>event_id</strong></td>
<td>int</td>
<td>&#x76F8;&#x5BF9;&#x5E94; access &#x4E8B;&#x4EF6;&#x7684;&#x6570;&#x636E;&#x5E93; id</td>
</tr>
<tr>
<td><strong>header_key</strong></td>
<td>varchar</td>
<td>&#x8BF7;&#x6C42;&#x5934;&#x7684;&#x540D;&#x5B57;&#xFF0C;&#x4F8B;&#x5982; <em>User-Agent</em></td>
</tr>
<tr>
<td><strong>header_value</strong></td>
<td>varchar</td>
<td>&#x8BF7;&#x6C42;&#x5934;&#x7684;&#x503C;&#xFF0C;&#x4F8B;&#x5982;  <em>Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0</em></td>
</tr>
</tbody>
</table>
<p>classic &#x4E2D;&#x7684; <code>DBAppender</code> &#x5C5E;&#x6027;&#x5728; access &#x7684; <code>DBAppender</code> &#x4E2D;&#x4E00;&#x6837;&#x6709;&#x6548;&#x3002;&#x540E;&#x8005;&#x63D0;&#x4F9B;&#x4E86;&#x53E6;&#x4E00;&#x4E2A;&#x9009;&#x9879;&#xFF0C;&#x5982;&#x4E0B;&#xFF1A;</p>
<table>
<thead>
<tr>
<th>&#x5C5E;&#x6027;&#x540D;</th>
<th>&#x7C7B;&#x578B;</th>
<th>&#x63CF;&#x8FF0;</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>insertHeaders</strong></td>
<td>boolean</td>
<td>&#x544A;&#x8BC9; <code>DBAppender</code> &#x7528;&#x6240;&#x6709;&#x8BF7;&#x6C42;&#x7684;&#x8BF7;&#x6C42;&#x5934;&#x6765;&#x586B;&#x5145;&#x6570;&#x636E;&#x5E93;</td>
</tr>
</tbody>
</table>
<p>&#x4E0B;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x4F7F;&#x7528; <code>DBAppender</code> &#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p>
<blockquote>
<p>Example: <em>logback-DB.xml</em></p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;DB&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.access.db.DBAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">connectionSource</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.db.DriverManagerConnectionSource&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">driverClass</span>&gt;</span>com.mysql.jdbc.Driver<span class="hljs-tag">&lt;/<span class="hljs-name">driverClass</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">url</span>&gt;</span>jdbc:mysql://localhost:3306/logbackdb<span class="hljs-tag">&lt;/<span class="hljs-name">url</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">user</span>&gt;</span>logback<span class="hljs-tag">&lt;/<span class="hljs-name">user</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">password</span>&gt;</span>logback<span class="hljs-tag">&lt;/<span class="hljs-name">password</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">connectionSource</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">insertHeaders</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">insertHeaders</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;DB&quot;</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<h3 id="siftingappender">SiftingAppender</h3>
<p>logback-access &#x4E2D;&#x7684; SiftingAppender &#x8DDF; logback-classic &#x4E2D;&#x7684; SiftingAppender &#x975E;&#x5E38;&#x76F8;&#x4F3C;&#x3002;&#x4E3B;&#x8981;&#x7684;&#x4E0D;&#x540C;&#x5728;&#x4E8E; logback-access &#x9ED8;&#x8BA4;&#x7684; discriminator &#x540D;&#x5B57;&#x53EB; <a href="https://logback.qos.ch/xref/ch/qos/logback/access/sift/AccessEventDiscriminator.html" target="_blank">AccessEventDiscriminator</a>&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x57FA;&#x4E8E; MDC&#x3002;&#x4ECE;&#x540D;&#x5B57;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;AccessEventDiscriminator &#x5728; AccessEvent &#x4E2D;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x6307;&#x5B9A;&#x7684;&#x5B57;&#x6BB5;&#x6765;&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x5185;&#x7F6E;&#x7684; appender&#x3002;&#x5982;&#x679C;&#x5B83;&#x7684;&#x503C;&#x4E3A; null&#xFF0C;&#x90A3;&#x4E48;&#x5C06;&#x4F7F;&#x7528; <code>defaultValue</code> &#x6307;&#x5B9A;&#x7684;&#x503C;&#x3002;</p>
<p>&#x6307;&#x5B9A;&#x7684; AccessEvent &#x53EF;&#x4EE5;&#x662F; COOKIE, REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, LOCAL_PORT, REQUEST_URI &#x5176;&#x4E2D;&#x7684;&#x4E00;&#x79CD;&#x3002;&#x6CE8;&#x610F;&#xFF0C;&#x524D;&#x4E09;&#x4E2A;&#x5B57;&#x6BB5;&#x4E2D;&#x5FC5;&#x987B;&#x6307;&#x5B9A; <code>AdditionalKey</code>&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x662F;&#x914D;&#x7F6E;&#x793A;&#x4F8B;&#xFF1A;</p>
<blockquote>
<p>Example: access-siftingFile.xml </p>
</blockquote>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">configuration</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;SIFTING&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.access.sift.SiftingAppender&quot;</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">Discriminator</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.access.sift.AccessEventDiscriminator&quot;</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">Key</span>&gt;</span>id<span class="hljs-tag">&lt;/<span class="hljs-name">Key</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">FieldName</span>&gt;</span>SESSION_ATTRIBUTE<span class="hljs-tag">&lt;/<span class="hljs-name">FieldName</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">AdditionalKey</span>&gt;</span>username<span class="hljs-tag">&lt;/<span class="hljs-name">AdditionalKey</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">defaultValue</span>&gt;</span>NA<span class="hljs-tag">&lt;/<span class="hljs-name">defaultValue</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">Discriminator</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">sift</span>&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">appender</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;ch.qos.logback:logback-site:jar:1.3.0-alpha4&quot;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.core.FileAppender&quot;</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">file</span>&gt;</span>byUser/ch.qos.logback:logback-site:jar:1.3.0-alpha4.log<span class="hljs-tag">&lt;/<span class="hljs-name">file</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">layout</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;ch.qos.logback.access.PatternLayout&quot;</span>&gt;</span>
          <span class="hljs-tag">&lt;<span class="hljs-name">pattern</span>&gt;</span>%h %l %u %t \&quot;%r\&quot; %s %b<span class="hljs-tag">&lt;/<span class="hljs-name">pattern</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">layout</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">sift</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">appender</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">appender-ref</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">&quot;SIFTING&quot;</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">configuration</span>&gt;</span>
</code></pre>
<p>&#x5728;&#x4E0A;&#x9762;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;<code>SiftingAppender</code> &#x5185;&#x7F6E;&#x4E86;&#x4E00;&#x4E2A; <code>FileAppender</code> &#x5B9E;&#x4F8B;&#x3002;&#x540D;&#x4E3A; &quot;id&quot; &#x7684;&#x952E;&#x88AB;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x53D8;&#x91CF;&#x7528;&#x4E8E;&#x5185;&#x7F6E;&#x7684; <code>FileAppender</code> &#x5B9E;&#x4F8B;&#x3002;&#x9ED8;&#x8BA4;&#x7684; discriminator&#xFF0C;&#x540D;&#x53EB; AccessEventDiscriminator&#xFF0C;&#x4F1A;&#x5728;&#x6BCF;&#x4E2A; <code>AccessEvent</code> &#x4E2D;&#x67E5;&#x627E;&#x4E00;&#x4E2A; &quot;username&quot; &#x7684; session &#x5C5E;&#x6027;&#x3002;&#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x90A3;&#x4E48;&#x5C06;&#x4F7F;&#x7528;&#x9ED8;&#x8BA4;&#x503C; &quot;NA&quot;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x540D;&#x53EB; &quot;username&quot; &#x7684; session &#x5C5E;&#x6027;&#x5305;&#x542B;&#x4E86;&#x7528;&#x6237;&#x6BCF;&#x6761;&#x65E5;&#x5FD7;&#x7684;&#x7528;&#x6237;&#x540D;&#xFF0C;&#x90A3;&#x4E48;&#x4EE5;&#x7528;&#x6237;&#x540D;&#x547D;&#x540D;&#x7684;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x5C06;&#x4F1A;&#x5728; <em>byUser/</em> &#x6587;&#x4EF6;&#x5939;&#x4E0B;&#xFF0C;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x5305;&#x542B;&#x4E86;&#x8BE5;&#x7528;&#x6237;&#x4EA7;&#x751F;&#x7684;&#x6240;&#x6709; access &#x65E5;&#x5FD7;&#x3002;</p>



                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="03第三章logback的配置.html" class="navigation navigation-prev " aria-label="Previous page: 第三章：logback 的配置">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="05第五章Encoder.html" class="navigation navigation-next " aria-label="Next page: 第五章：Encoder">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"第四章：Appenders","level":"1.5","depth":1,"next":{"title":"第五章：Encoder","level":"1.6","depth":1,"path":"05第五章Encoder.md","ref":"05第五章Encoder.md","articles":[]},"previous":{"title":"第三章：logback 的配置","level":"1.4","depth":1,"path":"03第三章logback的配置.md","ref":"03第三章logback的配置.md","articles":[]},"dir":"ltr"},"config":{"plugins":["add-js-css","myseo"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"add-js-css":{"js":["./lib/site.js"]},"myseo":{"description":"logback中文网包含了logback中文文档，最新资讯，应用案例等。logback 继承自 log4j，它建立在有十年工业经验的日志系统之上。它比其它所有的日志系统更快并且更小，包含了许多独特并且有用的特性。","keywords":"logback中文文档, logback api文档, logback log4j,springboot logback,logback日志类型","titlePrefix":"logback中文网|"},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","keywords":"","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"logback中文手册","gitbook":"*","description":""},"file":{"path":"04第四章Appenders.md","mtime":"2019-02-12T05:09:14.000Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-02-24T03:19:05.191Z"},"basePath":".","book":{"language":""}});
        });
    </script>
</div>

        
    <script src="gitbook/gitbook.js"></script>
    <script src="gitbook/theme.js"></script>
    
        
        <script src="gitbook/gitbook-plugin-add-js-css/fda70cfc36440304bb976a11f47eb151-site.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-search/search.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    

    </body>
</html>

